Translated ['src/mobile-pentesting/android-app-pentesting/android-task-h

This commit is contained in:
Translator 2025-02-25 22:34:42 +00:00
parent 7e52bd8bb5
commit db5809208d
5 changed files with 72 additions and 21 deletions

View File

@ -28,16 +28,22 @@ El atributo `launchMode` dirige el manejo de instancias de actividad dentro de l
### Pasos detallados del ataque
1. **Instalación de la aplicación maliciosa**: La víctima instala la aplicación del atacante en su dispositivo.
2. **Activación inicial**: La víctima abre primero la aplicación maliciosa, preparando el dispositivo para el ataque.
2. **Activación inicial**: La víctima abre primero la aplicación maliciosa, configurando el dispositivo para el ataque.
3. **Intento de lanzamiento de la aplicación objetivo**: La víctima intenta abrir la aplicación objetivo.
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.
4. **Ejecución del secuestro**: En algún momento, la aplicación intenta abrir la vista **singleTask**. Debido a la coincidencia de afinidad de tarea, se lanza la aplicación maliciosa 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, consulta el repositorio Task Hijacking Strandhogg en GitHub: [Task Hijacking Strandhogg](https://github.com/az0mb13/Task_Hijacking_Strandhogg).
> [!TIP]
> Tenga en cuenta que para que este ataque funcione, la vista vulnerable **no necesita tener exportado a verdadero** ni necesita ser la actividad principal.
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).
### Medidas de prevención
Para prevenir tales ataques, los desarrolladores pueden establecer `taskAffinity` en una cadena vacía y optar por el modo de lanzamiento `singleInstance`, asegurando el aislamiento de su aplicación de otras. Personalizar la función `onBackPressed()` ofrece protección adicional contra el secuestro de tareas.
Para prevenir tales ataques, los desarrolladores pueden:
- Establecer **`**taskAffinity`** de la vista **singleTask** a una cadena vacía (`android:taskAffinity=""`)
- Optar por el modo de lanzamiento **`singleInstance`**, asegurando el aislamiento de su aplicación de otras.
- Personalizar la función **`onBackPressed()`** ofrece protección adicional contra el secuestro de tareas.
## **Referencias**

View File

@ -6,34 +6,76 @@ Para confirmar si la aplicación fue construida sobre el framework React Native,
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 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 de 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.
Para analizar más a fondo el código JavaScript, crea un archivo llamado `index.html` en el mismo directorio con el siguiente código:
## Código Javascript
Si al revisar el contenido de `index.android.bundle` encuentras el código JavaScript de la aplicación (incluso si está minificado), puedes **analizarlo para encontrar información sensible y vulnerabilidades**.
Dado que el bundle contiene en realidad todo el código JS de la aplicación, es posible **dividirlo en diferentes archivos** (potencialmente facilitando su ingeniería inversa) usando la **herramienta [react-native-decompiler](https://github.com/numandev1/react-native-decompiler)**.
### Webpack
Para analizar más a fondo el código JavaScript, puedes subir el archivo a [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) o seguir estos pasos:
1. Crea un archivo llamado `index.html` en el mismo directorio con el siguiente código:
```html
<script src="./index.android.bundle"></script>
```
Puedes subir el archivo a [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) o seguir estos pasos:
2. Abre el archivo `index.html` en Google Chrome.
1. Abre el archivo `index.html` en Google Chrome.
3. Abre la Developer Toolbar 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**.
4. Haz clic en "Sources" en la Developer Toolbar. 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 minificado. Los archivos de mapa contienen mapeo de origen, lo que te permite mapear identificadores minificados.
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 sensibles y endpoints, 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. Identifica palabras clave sensibles para analizar el código JavaScript. Las aplicaciones de React Native a menudo utilizan servicios de terceros como Firebase, endpoints de servicio AWS S3, claves privadas, etc.
2. En este caso específico, se observó que la aplicación estaba utilizando el servicio Dialogflow. Busca un patrón relacionado con su configuración.
3. Fue afortunado que se encontraran credenciales sensibles codificadas de forma rígida en el código JavaScript durante el proceso de reconocimiento.
3. Fue afortunado que se encontraran credenciales sensibles codificadas en el código JavaScript durante el proceso de reconocimiento.
### Cambiar el código JS y reconstruir
En este caso, cambiar el código es fácil. Solo necesitas renombrar la aplicación para usar la extensión `.zip` y extraerla. Luego puedes **modificar el código JS dentro de este paquete y reconstruir la aplicación**. Esto debería ser suficiente para permitirte **inyectar código** en la aplicación con fines de prueba.
## Código de bytes de Hermes
Si el paquete contiene **código de bytes de Hermes**, **no podrás acceder al código Javascript** de la aplicación (ni siquiera a la versión minificada).
Puedes verificar si el paquete contiene código de bytes de Hermes ejecutando el siguiente comando:
```bash
file index.android.bundle
index.android.bundle: Hermes JavaScript bytecode, version 96
```
Sin embargo, puedes usar las herramientas **[hbctool](https://github.com/bongtrop/hbctool)**, **[hermes-dec](https://github.com/P1sec/hermes-dec)** o **[hermes_rs](https://github.com/Pilfer/hermes_rs)** para **desensamblar el bytecode** y también para **decompilarlo a algún código JS pseudo**. Para hacer esto, por ejemplo, estos comandos:
```bash
hbc-disassembler ./index.android.bundle /tmp/my_output_file.hasm
hbc-decompiler ./index.android.bundle /tmp/my_output_file.js
```
### Cambiar código y reconstruir
Idealmente, deberías poder modificar el código desensamblado (cambiando una comparación, un valor o lo que necesites modificar) y luego **reconstruir el bytecode** y luego reconstruir la aplicación.
La herramienta **[hbctool](https://github.com/bongtrop/hbctool)** soporta desensamblar el paquete y volver a construirlo después de que se hayan realizado los cambios, sin embargo, **solo soporta versiones antiguas** del bytecode de Hermes.
La herramienta **[hermes-dec](https://github.com/P1sec/hermes-dec)** no soporta la reconstrucción del bytecode.
La herramienta **[hermes_rs](https://github.com/Pilfer/hermes_rs)** soporta la reconstrucción del bytecode, pero en realidad es una biblioteca y no una herramienta de línea de comandos.
## Análisis Dinámico
Podrías intentar analizar dinámicamente la aplicación usando Frida para habilitar el modo desarrollador de la aplicación React y usar **`react-native-debugger`** para conectarte a ella. Sin embargo, para esto aparentemente necesitas el código fuente de la aplicación. Puedes encontrar más información sobre esto en [https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/](https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/).
## Referencias
- [https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7](https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7)
- [https://www.assetnote.io/resources/research/expanding-the-attack-surface-react-native-android-applications](https://www.assetnote.io/resources/research/expanding-the-attack-surface-react-native-android-applications)
- [https://payatu.com/wp-content/uploads/2023/02/Mastering-React-Native-Application-Pentesting-A-Practical-Guide-2.pdf](https://payatu.com/wp-content/uploads/2023/02/Mastering-React-Native-Application-Pentesting-A-Practical-Guide-2.pdf)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -5,11 +5,13 @@
## **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 realmente está realizando acciones en 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**.
### Detección
Para detectar aplicaciones vulnerables a este ataque, debes buscar **actividades exportadas** en el manifiesto de Android (ten en cuenta que una actividad con un intent-filter se exporta automáticamente por defecto). Una vez que hayas encontrado las actividades exportadas, **verifica si requieren algún permiso**. Esto se debe a que la **aplicación maliciosa también necesitará ese permiso**.
Para detectar aplicaciones vulnerables a este ataque, debes buscar **actividades exportadas** en el manifiesto de android (ten en cuenta que una actividad con un intent-filter se exporta automáticamente por defecto). Una vez que hayas encontrado las actividades exportadas, **verifica si requieren algún permiso**. Esto se debe a que la **aplicación maliciosa también necesitará ese permiso**.
También puedes verificar la versión mínima del SDK de la aplicación, comprobando el valor de **`android:minSdkVersion`** en el archivo **`AndroidManifest.xml`**. Si el valor es **menor que 30**, la aplicación es vulnerable a Tapjacking.
### Protección
@ -39,7 +41,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 usarla**.
Sigue las **instrucciones del README para usarlo**.
### FloatingWindowApp
@ -58,5 +60,4 @@ La mitigación es relativamente simple, ya que el desarrollador puede optar por
>
> Para habilitar el filtrado de toques, llama a [`setFilterTouchesWhenObscured(boolean)`](https://developer.android.com/reference/android/view/View#setFilterTouchesWhenObscured%28boolean%29) o establece el atributo de diseño android:filterTouchesWhenObscured en true. Cuando está habilitado, el marco descartará los toques que se reciban siempre que la ventana de la vista esté oscurecida por otra ventana visible. Como resultado, la vista no recibirá toques siempre que un toast, diálogo u otra ventana aparezca sobre la ventana de la vista.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -471,12 +471,13 @@ window.search = window.search || {};
showResults(true);
}
fetch(path_to_root + 'searchindex.json')
var branch = lang === "en" ? "master" : lang
fetch(`https://raw.githubusercontent.com/HackTricks-wiki/hacktricks/refs/heads/${branch}/searchindex.json`)
.then(response => response.json())
.then(json => init(json))
.catch(error => { // Try to load searchindex.js if fetch failed
var script = document.createElement('script');
script.src = path_to_root + 'searchindex.js';
script.src = `https://raw.githubusercontent.com/HackTricks-wiki/hacktricks/refs/heads/${branch}/searchindex.js`;
script.onload = () => init(window.search);
document.head.appendChild(script);
});

View File

@ -55,6 +55,7 @@
<!-- Provide site root to javascript -->
<script>
var path_to_root = "{{ path_to_root }}";
var lang = "{{ language }}";
var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "{{ preferred_dark_theme }}" : "{{ default_theme }}";
</script>
<!-- Start loading toc.js asap -->