mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-27 07:01:09 +00:00
457 lines
19 KiB
Markdown
457 lines
19 KiB
Markdown
# Tutorial de Frida
|
|
|
|
<details>
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
|
|
|
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
|
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
|
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|
|
|
|
<img src="../../../.gitbook/assets/i3.png" alt="" data-size="original">
|
|
|
|
**Consejo para recompensas por errores**: **regístrate** en **Intigriti**, una plataforma premium de **recompensas por errores creada por hackers, para hackers**. ¡Únete a nosotros en [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoy mismo y comienza a ganar recompensas de hasta **$100,000**!
|
|
|
|
{% embed url="https://go.intigriti.com/hacktricks" %}
|
|
|
|
## Instalación
|
|
|
|
Instala las **herramientas de Frida**:
|
|
```bash
|
|
pip install frida-tools
|
|
pip install frida
|
|
```
|
|
**Descarga e instala** en el dispositivo Android el **servidor de Frida** ([Descarga la última versión](https://github.com/frida/frida/releases)).\
|
|
Una línea de comando para reiniciar adb en modo root, conectarse a él, cargar frida-server, otorgar permisos de ejecución y ejecutarlo en segundo plano:
|
|
|
|
{% code overflow="wrap" %}
|
|
```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 &"
|
|
```
|
|
{% endcode %}
|
|
|
|
**Comprueba** si está **funcionando**:
|
|
```bash
|
|
frida-ps -U #List packages and processes
|
|
frida-ps -U | grep -i <part_of_the_package_name> #Get all the package name
|
|
```
|
|
## Tutoriales
|
|
|
|
### [Tutorial 1](frida-tutorial-1.md)
|
|
|
|
**Desde**: [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)
|
|
|
|
Sigue el [enlace para leerlo](frida-tutorial-1.md).
|
|
|
|
### [Tutorial 2](frida-tutorial-2.md)
|
|
|
|
**Desde**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Partes 2, 3 y 4)\
|
|
**APKs y código fuente**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples)
|
|
|
|
Sigue el [enlace para leerlo](frida-tutorial-2.md).
|
|
|
|
### [Tutorial 3](owaspuncrackable-1.md)
|
|
|
|
**Desde**: [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)\
|
|
**APK**: [https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level\_01/UnCrackable-Level1.apk](https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level\_01/UnCrackable-Level1.apk)
|
|
|
|
Sigue el [enlace para leerlo](owaspuncrackable-1.md).\
|
|
**Puedes encontrar algunos scripts increíbles de Frida aquí:** [**https://codeshare.frida.re/**](https://codeshare.frida.re)
|
|
|
|
## Ejemplos rápidos
|
|
|
|
Aquí puedes encontrar las funcionalidades más básicas e interesantes de Frida para crear un script rápido:
|
|
|
|
### Llamando a Frida desde la línea de comandos
|
|
```bash
|
|
frida-ps -U
|
|
|
|
#Basic frida hooking
|
|
frida -l disableRoot.js -f owasp.mstg.uncrackable1
|
|
|
|
#Hooking before starting the app
|
|
frida -U --no-pause -l disableRoot.js -f owasp.mstg.uncrackable1
|
|
#The --no-pause and -f options allow the app to be spawned automatically,
|
|
#frozen so that the instrumentation can occur, and the automatically
|
|
#continue execution with our modified code.
|
|
```
|
|
### Script básico de Python
|
|
|
|
```python
|
|
import frida
|
|
|
|
# Attach to the target process
|
|
session = frida.attach("com.example.app")
|
|
|
|
# Define the JavaScript code to be injected
|
|
js_code = """
|
|
Java.perform(function () {
|
|
// Find the target method
|
|
var targetMethod = Java.use("com.example.app.TargetClass.targetMethod");
|
|
|
|
// Hook the target method
|
|
targetMethod.implementation = function () {
|
|
// Print the arguments passed to the method
|
|
console.log("Arguments: " + Array.prototype.slice.call(arguments));
|
|
|
|
// Call the original method
|
|
var result = this.targetMethod.apply(this, arguments);
|
|
|
|
// Print the result of the method
|
|
console.log("Result: " + result);
|
|
|
|
// Modify the result if needed
|
|
// result = "Modified result";
|
|
|
|
// Return the result
|
|
return result;
|
|
};
|
|
});
|
|
"""
|
|
|
|
# Create the script
|
|
script = session.create_script(js_code)
|
|
|
|
# Load the script into the target process
|
|
script.load()
|
|
|
|
# Detach from the target process
|
|
session.detach()
|
|
```
|
|
|
|
### Script básico de Python
|
|
|
|
```python
|
|
import frida
|
|
|
|
# Adjuntarse al proceso objetivo
|
|
session = frida.attach("com.example.app")
|
|
|
|
# Definir el código JavaScript a inyectar
|
|
js_code = """
|
|
Java.perform(function () {
|
|
// Encontrar el método objetivo
|
|
var targetMethod = Java.use("com.example.app.TargetClass.targetMethod");
|
|
|
|
// Enganchar el método objetivo
|
|
targetMethod.implementation = function () {
|
|
// Imprimir los argumentos pasados al método
|
|
console.log("Argumentos: " + Array.prototype.slice.call(arguments));
|
|
|
|
// Llamar al método original
|
|
var result = this.targetMethod.apply(this, arguments);
|
|
|
|
// Imprimir el resultado del método
|
|
console.log("Resultado: " + result);
|
|
|
|
// Modificar el resultado si es necesario
|
|
// result = "Resultado modificado";
|
|
|
|
// Devolver el resultado
|
|
return result;
|
|
};
|
|
});
|
|
"""
|
|
|
|
# Crear el script
|
|
script = session.create_script(js_code)
|
|
|
|
# Cargar el script en el proceso objetivo
|
|
script.load()
|
|
|
|
# Desadjuntarse del proceso objetivo
|
|
session.detach()
|
|
```
|
|
```python
|
|
import frida, sys
|
|
|
|
jscode = open(sys.argv[0]).read()
|
|
process = frida.get_usb_device().attach('infosecadventures.fridademo')
|
|
script = process.create_script(jscode)
|
|
print('[ * ] Running Frida Demo application')
|
|
script.load()
|
|
sys.stdin.read()
|
|
```
|
|
### Enganchando funciones sin parámetros
|
|
|
|
Engancha la función `a()` de la clase `sg.vantagepoint.a.c`
|
|
```javascript
|
|
Java.perform(function () {
|
|
; rootcheck1.a.overload().implementation = function() {
|
|
rootcheck1.a.overload().implementation = function() {
|
|
send("sg.vantagepoint.a.c.a()Z Root check 1 HIT! su.exists()");
|
|
return false;
|
|
};
|
|
});
|
|
```
|
|
# Hook java `exit()`
|
|
|
|
## Introduction
|
|
|
|
In this tutorial, we will learn how to hook the `exit()` method in a Java application using Frida. By hooking this method, we can intercept the application's exit calls and perform additional actions before the application terminates.
|
|
|
|
## Prerequisites
|
|
|
|
Before getting started, make sure you have the following:
|
|
|
|
- A rooted Android device or an emulator
|
|
- Frida installed on your machine
|
|
- Basic knowledge of JavaScript and Java
|
|
|
|
## Steps
|
|
|
|
Follow the steps below to hook the `exit()` method:
|
|
|
|
1. Launch the target application on your Android device or emulator.
|
|
|
|
2. Open a terminal and start the Frida server by running the following command:
|
|
|
|
```bash
|
|
frida-server
|
|
```
|
|
|
|
3. Create a new JavaScript file, for example, `hook.js`, and add the following code:
|
|
|
|
```javascript
|
|
Java.perform(function () {
|
|
var System = Java.use('java.lang.System');
|
|
var Runtime = Java.use('java.lang.Runtime');
|
|
|
|
// Hook the exit() method
|
|
System.exit.overload('int').implementation = function (status) {
|
|
console.log('Exit status: ' + status);
|
|
|
|
// Perform additional actions here
|
|
|
|
// Call the original exit() method
|
|
this.exit(status);
|
|
};
|
|
});
|
|
```
|
|
|
|
4. Save the `hook.js` file.
|
|
|
|
5. In the terminal, navigate to the directory where the `hook.js` file is located.
|
|
|
|
6. Run the following command to start the Frida script:
|
|
|
|
```bash
|
|
frida -U -l hook.js -f <package_name>
|
|
```
|
|
|
|
Replace `<package_name>` with the package name of the target application.
|
|
|
|
7. You should see the output of the `console.log()` statement whenever the `exit()` method is called in the target application.
|
|
|
|
8. Customize the code inside the `implementation` function to perform your desired actions before the application exits.
|
|
|
|
## Conclusion
|
|
|
|
By hooking the `exit()` method using Frida, we can intercept and modify the behavior of an application when it tries to exit. This technique can be useful for various purposes, such as analyzing the application's termination process or preventing it from exiting under certain conditions.
|
|
```javascript
|
|
var sysexit = Java.use("java.lang.System");
|
|
sysexit.exit.overload("int").implementation = function(var_0) {
|
|
send("java.lang.System.exit(I)V // We avoid exiting the application :)");
|
|
};
|
|
```
|
|
# Tutorial de Frida: Enganchando `.onStart()` y `.onCreate()` de MainActivity
|
|
|
|
En este tutorial, aprenderemos cómo utilizar Frida para enganchar los métodos `.onStart()` y `.onCreate()` de la clase MainActivity en una aplicación de Android. Esto nos permitirá interceptar y modificar el comportamiento de estos métodos en tiempo de ejecución.
|
|
|
|
## Requisitos previos
|
|
|
|
Antes de comenzar, asegúrate de tener instalado lo siguiente:
|
|
|
|
- Frida Server en el dispositivo Android objetivo.
|
|
- Frida CLI en tu máquina local.
|
|
|
|
## Paso 1: Conectarse al dispositivo
|
|
|
|
Primero, debemos conectarnos al dispositivo Android objetivo utilizando Frida CLI. Ejecuta el siguiente comando en tu terminal:
|
|
|
|
```bash
|
|
frida-ps -U
|
|
```
|
|
|
|
Esto mostrará una lista de los procesos en ejecución en el dispositivo. Asegúrate de que la aplicación que deseas pentestar esté en la lista.
|
|
|
|
## Paso 2: Crear el script de Frida
|
|
|
|
A continuación, crearemos un script de Frida para enganchar los métodos `.onStart()` y `.onCreate()` de la clase MainActivity. Crea un archivo llamado `hook.js` y pega el siguiente código:
|
|
|
|
```javascript
|
|
Java.perform(function() {
|
|
var MainActivity = Java.use('com.example.app.MainActivity');
|
|
|
|
MainActivity.onStart.implementation = function() {
|
|
console.log('Método onStart() enganchado');
|
|
// Agrega aquí tu código personalizado
|
|
this.onStart();
|
|
};
|
|
|
|
MainActivity.onCreate.implementation = function() {
|
|
console.log('Método onCreate() enganchado');
|
|
// Agrega aquí tu código personalizado
|
|
this.onCreate();
|
|
};
|
|
});
|
|
```
|
|
|
|
## Paso 3: Ejecutar el script de Frida
|
|
|
|
Ahora, ejecutaremos el script de Frida para enganchar los métodos `.onStart()` y `.onCreate()`. Ejecuta el siguiente comando en tu terminal:
|
|
|
|
```bash
|
|
frida -U -l hook.js -f com.example.app
|
|
```
|
|
|
|
Esto iniciará la aplicación de Android objetivo y enganchará los métodos especificados en el script de Frida.
|
|
|
|
## Paso 4: Verificar la salida
|
|
|
|
Finalmente, verifica la salida en la terminal para confirmar que los métodos `.onStart()` y `.onCreate()` han sido enganchados con éxito. También puedes agregar tu propio código personalizado dentro de los métodos enganchados para modificar su comportamiento.
|
|
|
|
¡Felicidades! Ahora sabes cómo utilizar Frida para enganchar los métodos `.onStart()` y `.onCreate()` de la clase MainActivity en una aplicación de Android. Esto te permitirá realizar pruebas de penetración y modificar el comportamiento de la aplicación en tiempo de ejecución.
|
|
```javascript
|
|
var mainactivity = Java.use("sg.vantagepoint.uncrackable1.MainActivity");
|
|
mainactivity.onStart.overload().implementation = function() {
|
|
send("MainActivity.onStart() HIT!!!");
|
|
var ret = this.onStart.overload().call(this);
|
|
};
|
|
mainactivity.onCreate.overload("android.os.Bundle").implementation = function(var_0) {
|
|
send("MainActivity.onCreate() HIT!!!");
|
|
var ret = this.onCreate.overload("android.os.Bundle").call(this,var_0);
|
|
};
|
|
```
|
|
# Hook android `.onCreate()`
|
|
|
|
En este tutorial, aprenderás cómo realizar un hook en el método `.onCreate()` de una aplicación Android utilizando Frida.
|
|
|
|
## Requisitos previos
|
|
|
|
- Dispositivo Android rooteado o emulador con acceso de root.
|
|
- Frida Server instalado en el dispositivo objetivo.
|
|
- Conocimientos básicos de JavaScript.
|
|
|
|
## Pasos
|
|
|
|
1. Abre una terminal y ejecuta el siguiente comando para iniciar el servidor Frida en el dispositivo objetivo:
|
|
|
|
```
|
|
frida-server
|
|
```
|
|
|
|
2. Asegúrate de que el dispositivo objetivo y tu máquina estén conectados a la misma red.
|
|
|
|
3. En tu máquina, crea un nuevo archivo JavaScript llamado `hook.js` y ábrelo en un editor de texto.
|
|
|
|
4. Agrega el siguiente código al archivo `hook.js`:
|
|
|
|
```javascript
|
|
Java.perform(function() {
|
|
var targetClass = Java.use('com.example.app.MainActivity');
|
|
targetClass.onCreate.implementation = function() {
|
|
console.log('Hook exitoso en el método onCreate()');
|
|
this.onCreate();
|
|
};
|
|
});
|
|
```
|
|
|
|
5. Guarda el archivo `hook.js`.
|
|
|
|
6. Ejecuta el siguiente comando en la terminal para iniciar el script de Frida:
|
|
|
|
```
|
|
frida -U -l hook.js com.example.app
|
|
```
|
|
|
|
Asegúrate de reemplazar `com.example.app` con el nombre del paquete de la aplicación que deseas pentestar.
|
|
|
|
7. Abre la aplicación en el dispositivo objetivo y verás que se muestra el mensaje "Hook exitoso en el método onCreate()" en la terminal.
|
|
|
|
¡Felicidades! Has realizado un hook en el método `.onCreate()` de una aplicación Android utilizando Frida. Esto te permitirá interceptar y modificar el comportamiento de la aplicación en este punto específico.
|
|
```javascript
|
|
var activity = Java.use("android.app.Activity");
|
|
activity.onCreate.overload("android.os.Bundle").implementation = function(var_0) {
|
|
send("Activity HIT!!!");
|
|
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 plano:
|
|
```javascript
|
|
function getString(data){
|
|
var ret = "";
|
|
for (var i=0; i < data.length; i++){
|
|
ret += data[i].toString();
|
|
}
|
|
return ret
|
|
}
|
|
var aes_decrypt = Java.use("sg.vantagepoint.a.a");
|
|
aes_decrypt.a.overload("[B","[B").implementation = function(var_0,var_1) {
|
|
send("sg.vantagepoint.a.a.a([B[B)[B doFinal(enc) // AES/ECB/PKCS7Padding");
|
|
send("Key : " + getString(var_0));
|
|
send("Encrypted : " + getString(var_1));
|
|
var ret = this.a.overload("[B","[B").call(this,var_0,var_1);
|
|
send("Decrypted : " + ret);
|
|
|
|
var flag = "";
|
|
for (var i=0; i < ret.length; i++){
|
|
flag += String.fromCharCode(ret[i]);
|
|
}
|
|
send("Decrypted flag: " + flag);
|
|
return ret; //[B
|
|
};
|
|
```
|
|
### Enganchando funciones y llamándolas con nuestra entrada
|
|
|
|
Engancha una función que recibe una cadena y llámala con otra cadena (desde [aquí](https://11x256.github.io/Frida-hooking-android-part-2/))
|
|
```javascript
|
|
var string_class = Java.use("java.lang.String"); // get a JS wrapper for java's String class
|
|
|
|
my_class.fun.overload("java.lang.String").implementation = function(x){ //hooking the new function
|
|
var my_string = string_class.$new("My TeSt String#####"); //creating a new String by using `new` operator
|
|
console.log("Original arg: " +x );
|
|
var ret = this.fun(my_string); // calling the original function with the new String, and putting its return value in ret variable
|
|
console.log("Return value: "+ret);
|
|
return ret;
|
|
};
|
|
```
|
|
### Obteniendo un objeto ya creado de una clase
|
|
|
|
Si deseas extraer algún atributo de un objeto creado, puedes utilizar 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:
|
|
```javascript
|
|
Java.choose("com.example.a11x256.frida_test.my_activity" , {
|
|
onMatch : function(instance){ //This function will be called for every instance found by frida
|
|
console.log("Found instance: "+instance);
|
|
console.log("Result of secret func: " + instance.secret());
|
|
},
|
|
onComplete:function(){}
|
|
});
|
|
```
|
|
<img src="../../../.gitbook/assets/i3.png" alt="" data-size="original">
|
|
|
|
**Consejo de recompensa por errores**: ¡**regístrate** en **Intigriti**, una plataforma premium de **recompensas por errores creada por hackers, para hackers**! ¡Únete a nosotros en [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoy mismo y comienza a ganar recompensas de hasta **$100,000**!
|
|
|
|
{% embed url="https://go.intigriti.com/hacktricks" %}
|
|
|
|
<details>
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
|
|
|
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
|
|
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
|
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
|
|
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
|
|
|
</details>
|