hacktricks/mobile-pentesting/android-app-pentesting/frida-tutorial
2023-09-24 14:31:54 +00:00
..
frida-tutorial-1.md Translated ['README.md', 'backdoors/salseo.md', 'cryptography/certificat 2023-09-24 14:31:54 +00:00
frida-tutorial-2.md f 2023-06-05 20:33:24 +02:00
objection-tutorial.md Translated ['backdoors/salseo.md', 'forensics/basic-forensic-methodology 2023-08-22 10:36:15 +00:00
owaspuncrackable-1.md Translated ['generic-methodologies-and-resources/shells/windows.md', 'ma 2023-07-13 10:24:09 +00:00
README.md Translated ['mobile-pentesting/android-app-pentesting/README.md', 'mobil 2023-08-24 16:55:21 +00:00

Tutorial de Frida

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

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 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:

pip install frida-tools
pip install frida

Descarga e instala en el dispositivo Android el servidor de Frida (Descarga la última versión).
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" %}

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:

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

Desde: https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1
APK: https://github.com/t0thkr1s/frida-demo/releases
Código fuente: https://github.com/t0thkr1s/frida-demo

Sigue el enlace para leerlo.

Tutorial 2

Desde: 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

Sigue el enlace para leerlo.

Tutorial 3

Desde: https://joshspicer.com/android-frida-1
APK: https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk

Sigue el enlace para leerlo.
Puedes encontrar algunos scripts increíbles de Frida aquí: 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

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

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

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()
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

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:

    frida-server
    
  3. Create a new JavaScript file, for example, hook.js, and add the following code:

    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:

    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.

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:

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:

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:

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.

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:

    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.

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:

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í)

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:

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(){}
});

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 hoy mismo y comienza a ganar recompensas de hasta $100,000!

{% embed url="https://go.intigriti.com/hacktricks" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥