Translated ['mobile-pentesting/android-app-pentesting/android-applicatio

This commit is contained in:
Translator 2024-10-05 13:17:03 +00:00
parent 80cd35ef2c
commit 4de3406a26

View file

@ -28,7 +28,7 @@ Aprende y practica Hacking en GCP: <img src="/.gitbook/assets/grte.png" alt="" d
### 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 **desaconsejado**.\
**Para compartir el mismo UID, las aplicaciones deben definir el mismo valor `android:sharedUserId` en sus manifiestos.**
### Sandbox
@ -48,13 +48,13 @@ 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.
## Aplicaciones Preinstaladas
Estas aplicaciones generalmente se encuentran en los directorios **`/system/app`** o **`/system/priv-app`** y algunas de ellas están **optimizadas** (puede que ni siquiera encuentres el archivo `classes.dex`). Estas aplicaciones valen la pena revisarlas porque a veces están **ejecutándose con demasiados permisos** (como root).
Estas aplicaciones generalmente se encuentran en los directorios **`/system/app`** o **`/system/priv-app`** y algunas de ellas están **optimizadas** (puede que ni siquiera encuentres el archivo `classes.dex`). Estas aplicaciones valen la pena revisar porque a veces están **ejecutándose con demasiados permisos** (como root).
* Las que se envían con el **AOSP** (Android OpenSource Project) **ROM**
* Agregadas por el **fabricante** del dispositivo
@ -115,7 +115,7 @@ Para la ingeniería inversa, **Smali** se vuelve crucial. Es la versión legible
Las intenciones 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 una Intención es básicamente un **mensaje que se pasa entre componentes**. Las Intenciones **pueden dirigirse** a componentes o aplicaciones específicas, **o pueden enviarse sin un destinatario específico**.\
Así que una Intención es básicamente un **mensaje que se pasa entre componentes**. Las Intenciones **pueden ser dirigidas** a componentes o aplicaciones específicas, **o pueden enviarse sin un destinatario específico**.\
Para ser simple, la Intención se puede usar:
* Para iniciar una Actividad, típicamente abriendo una interfaz de usuario para una aplicación
@ -132,9 +132,9 @@ Si es vulnerable, **las Intenciones pueden ser utilizadas para realizar una vari
Los Filtros de Intención 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 Intenciones específicas 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 Intención 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`** en **`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 Intención 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`** 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.
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, agregando 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 -->
@ -211,7 +211,7 @@ El esquema debe ser declarado en el **`AndroidManifest.xml`**:
</intent-filter>
[...]
```
El esquema del ejemplo anterior es `exampleapp://` (nota también el **`category BROWSABLE`**)
El esquema del ejemplo anterior es `examplescheme://` (nota también la **`categoría BROWSABLE`**)
Luego, en el campo de datos, puedes especificar el **host** y **path**:
```xml
@ -230,7 +230,7 @@ Aprende a [llamar enlaces profundos sin usar páginas HTML](./#exploiting-scheme
## AIDL - Lenguaje de Definición de Interfaces de Android
El **Lenguaje de Definición de Interfaces de Android (AIDL)** está diseñado para facilitar la comunicación entre cliente y 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 Interfaces 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.
### Conceptos Clave
@ -246,9 +246,9 @@ Estos incluyen: **Actividades, Servicios, Receptores de Difusión y Proveedores.
### Actividad de Lanzamiento y otras actividades
En las aplicaciones de Android, **las actividades** son como pantallas, mostrando diferentes partes de la interfaz de usuario de la app. Una app puede tener muchas actividades, cada una presentando una pantalla única al usuario.
En las aplicaciones de Android, las **actividades** son como pantallas, mostrando diferentes partes de la interfaz de usuario de la app. Una app puede tener muchas actividades, cada una presentando una pantalla única al usuario.
La **actividad de lanzamiento** es la puerta principal a una app, lanzada cuando tocas el ícono de la app. Está definida en el archivo de manifiesto de la app con intenciones específicas MAIN y LAUNCHER:
La **actividad de lanzamiento** es la puerta principal a una app, lanzada cuando tocas el ícono de la app. Se define en el archivo de manifiesto de la app con intenciones específicas MAIN y LAUNCHER:
```markup
<activity android:name=".LauncherActivity">
<intent-filter>
@ -263,7 +263,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 de otra aplicación no siempre representa 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 de 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.
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.
@ -348,7 +348,7 @@ Para cargar contenido, están disponibles métodos como ````loadUrl````, ````loa
El "Bridge" de JavaScript permite que los objetos Java interactúen con JavaScript, requiriendo que los métodos estén marcados con ````@JavascriptInterface```` para seguridad desde Android 4.2 en adelante.
Permitir el acceso al contenido (````setAllowContentAccess(true)````) permite que los WebViews accedan a Content Providers, lo que podría ser un riesgo a menos que las URLs de contenido sean verificadas como seguras.
Permitir el acceso al contenido (````setAllowContentAccess(true)````) permite que los WebViews accedan a Content Providers, lo que podría ser un riesgo a menos que las URLs de contenido se verifiquen como seguras.
Para controlar el acceso a archivos:
- Deshabilitar el acceso a archivos (````setAllowFileAccess(false)````) limita el acceso al sistema de archivos, con excepciones para ciertos activos, asegurando que solo se utilicen para contenido no sensible.