From db5809208d04bcb6ea9fd2478fdc8c4e26c1e1d6 Mon Sep 17 00:00:00 2001 From: Translator Date: Tue, 25 Feb 2025 22:34:42 +0000 Subject: [PATCH] Translated ['src/mobile-pentesting/android-app-pentesting/android-task-h --- .../android-task-hijacking.md | 14 ++-- .../react-native-application.md | 64 +++++++++++++++---- .../android-app-pentesting/tapjacking.md | 9 +-- theme/ht_searcher.js | 5 +- theme/index.hbs | 1 + 5 files changed, 72 insertions(+), 21 deletions(-) diff --git a/src/mobile-pentesting/android-app-pentesting/android-task-hijacking.md b/src/mobile-pentesting/android-app-pentesting/android-task-hijacking.md index 5ede037ea..09298f328 100644 --- a/src/mobile-pentesting/android-app-pentesting/android-task-hijacking.md +++ b/src/mobile-pentesting/android-app-pentesting/android-task-hijacking.md @@ -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** diff --git a/src/mobile-pentesting/android-app-pentesting/react-native-application.md b/src/mobile-pentesting/android-app-pentesting/react-native-application.md index 6494398f0..bca8fdc3f 100644 --- a/src/mobile-pentesting/android-app-pentesting/react-native-application.md +++ b/src/mobile-pentesting/android-app-pentesting/react-native-application.md @@ -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 ``` -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}} diff --git a/src/mobile-pentesting/android-app-pentesting/tapjacking.md b/src/mobile-pentesting/android-app-pentesting/tapjacking.md index 40d449074..dc8092491 100644 --- a/src/mobile-pentesting/android-app-pentesting/tapjacking.md +++ b/src/mobile-pentesting/android-app-pentesting/tapjacking.md @@ -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}} diff --git a/theme/ht_searcher.js b/theme/ht_searcher.js index 1cee01a8c..52e150d9a 100644 --- a/theme/ht_searcher.js +++ b/theme/ht_searcher.js @@ -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); }); diff --git a/theme/index.hbs b/theme/index.hbs index 166e177c4..70b70a68a 100644 --- a/theme/index.hbs +++ b/theme/index.hbs @@ -55,6 +55,7 @@