Frida Tutorial

Οδηγός Frida

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Συμβουλή για bug bounty: εγγραφείτε στο Intigriti, μια προηγμένη πλατφόρμα bug bounty που δημιουργήθηκε από χάκερς, για χάκερς! Γίνετε μέλος μας στο https://go.intigriti.com/hacktricks σήμερα και αρχίστε να κερδίζετε αμοιβές έως και $100,000!

Εγκατάσταση

Εγκαταστήστε τα εργαλεία frida:

pip install frida-tools
pip install frida

Κατεβάστε και εγκαταστήστε στο Android τον διακομιστή frida (Κατεβάστε την τελευταία έκδοση). Ένας εντολή για να επανεκκινήσετε το adb σε root mode, να συνδεθείτε σε αυτό, να ανεβάσετε το frida-server, να δώσετε δικαιώματα εκτέλεσης και να το τρέξετε στο παρασκήνιο:

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 &"

Ελέγξτε αν δουλεύει:

frida-ps -U #List packages and processes
frida-ps -U | grep -i <part_of_the_package_name> #Get all the package name

Οδηγοί

Από: https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1 APK: https://github.com/t0thkr1s/frida-demo/releases Πηγαίος Κώδικας: https://github.com/t0thkr1s/frida-demo

Ακολουθήστε τον σύνδεσμο για να το διαβάσετε.

Από: https://11x256.github.io/Frida-hooking-android-part-2/ (Μέρη 2, 3 & 4) APKs και Πηγαίος Κώδικας: https://github.com/11x256/frida-android-examples

Ακολουθήστε τον σύνδεσμο για να το διαβάσετε.

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

Ακολουθήστε τον σύνδεσμο για να το διαβάσετε.

Μπορείτε να βρείτε περισσότερα εκπληκτικά scripts του Frida εδώ: https://codeshare.frida.re/

Γρήγορα Παραδείγματα

Κλήση του Frida από τη γραμμή εντολών

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.

Βασικό Σενάριο Python

import frida

# Συνάρτηση που καλείται όταν λαμβάνεται ένα μήνυμα από τον διακομιστή
def on_message(message, data):
    if message['type'] == 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)

# Φορτώνει το αρχείο JavaScript που θα εκτελεστεί στη συσκευή
with open("script.js", "r") as file:
    script_code = file.read()

# Σύνδεση με τη συσκευή Android
device = frida.get_usb_device()

# Επιλογή της εφαρμογής που θέλουμε να επιτεθούμε
pid = device.spawn(["com.example.app"])

# Αναμονή για την εκκίνηση της εφαρμογής
device.resume(pid)

# Αναμονή για τη σύνδεση με τη διεργασία της εφαρμογής
session = device.attach(pid)

# Φόρτωση του αρχείου JavaScript στη διεργασία της εφαρμογής
script = session.create_script(script_code)
script.on('message', on_message)
script.load()

# Αναμονή για το τέλος της εφαρμογής
input("[!] Πατήστε Enter για να τερματίσετε την επίθεση...")

# Αποσύνδεση από τη διεργασία της εφαρμογής
session.detach()

# Τερματισμός της εφαρμογής
device.kill(pid)

Αυτό είναι ένα βασικό σενάριο Python που χρησιμοποιεί το Frida για να επιτεθεί σε μια εφαρμογή Android. Το σενάριο φορτώνει ένα αρχείο JavaScript που θα εκτελεστεί στη συσκευή και συνδέεται με την εφαρμογή που έχει επιλεγεί για επίθεση. Όταν λαμβάνεται ένα μήνυμα από τον διακομιστή, εμφανίζεται στην οθόνη. Η επίθεση τερματίζεται όταν πατηθεί το Enter.

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

Σύνδεση συναρτήσεων χωρίς παραμέτρους

Συνδέστε τη συνάρτηση a() της κλάσης 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) της μεθόδου exit() στην Java

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  :)");
};

Σύνδεση (Hook) των μεθόδων .onStart() και .onCreate() του MainActivity

Για να συνδέσουμε (hook) τις μεθόδους .onStart() και .onCreate() του MainActivity σε μια εφαρμογή Android, μπορούμε να χρησιμοποιήσουμε το εργαλείο Frida. Ο Frida μας επιτρέπει να τροποποιήσουμε τον κώδικα της εφαρμογής κατά την εκτέλεσή της.

Παρακάτω παρουσιάζεται ένα παράδειγμα κώδικα σε Python για να συνδέσουμε τις εν λόγω μεθόδους:

import frida

# Ορίζουμε τη συνάρτηση που θα κληθεί κατά την κλήση της μεθόδου .onStart()
def on_start():
    print("Method onStart() called")

# Ορίζουμε τη συνάρτηση που θα κληθεί κατά την κλήση της μεθόδου .onCreate()
def on_create():
    print("Method onCreate() called")

# Βρίσκουμε τη διεργασία της εφαρμογής
process = frida.get_usb_device().attach("com.example.app")

# Φορτώνουμε το script στη διεργασία
with open("script.js") as f:
    script_code = f.read()
script = process.create_script(script_code)

# Ορίζουμε τις συναρτήσεις που θα κληθούν κατά την κλήση των μεθόδων
script.on("Java.perform", lambda: script.exports.hook_methods("com.example.app.MainActivity", "onStart", on_start))
script.on("Java.perform", lambda: script.exports.hook_methods("com.example.app.MainActivity", "onCreate", on_create))

# Εκτελούμε το script
script.load()

Στο παραπάνω παράδειγμα, ορίζουμε δύο συναρτήσεις on_start() και on_create() που θα κληθούν κατά την κλήση των μεθόδων .onStart() και .onCreate() αντίστοιχα. Στη συνέχεια, βρίσκουμε τη διεργασία της εφαρμογής και φορτώνουμε το script που περιέχει τον κώδικα για τη σύνδεση των μεθόδων. Τέλος, εκτελούμε το script.

Με αυτόν τον τρόπο, μπορούμε να παρακολουθήσουμε την εκτέλεση των μεθόδων .onStart() και .onCreate() του MainActivity σε μια εφαρμογή Android.

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) της μεθόδου .onCreate() σε Android

Η μέθοδος .onCreate() είναι μια από τις βασικές μεθόδους που χρησιμοποιούνται στην ανάπτυξη εφαρμογών Android. Συνήθως, καλείται κατά την εκκίνηση μιας δραστηριότητας (activity) και χρησιμοποιείται για την αρχικοποίηση των στοιχείων της δραστηριότητας.

Για να συνδέσουμε (hook) τη μέθοδο .onCreate() σε μια εφαρμογή Android, μπορούμε να χρησιμοποιήσουμε το εργαλείο Frida. Το Frida είναι ένα εργαλείο αντίστροφης μηχανικής που μας επιτρέπει να τροποποιήσουμε την εκτέλεση μιας εφαρμογής κατά τη διάρκεια της εκτέλεσής της.

Για να συνδέσουμε τη μέθοδο .onCreate() με το Frida, μπορούμε να χρησιμοποιήσουμε τον παρακάτω κώδικα JavaScript:

Java.perform(function() {
    var Activity = Java.use('android.app.Activity');
    Activity.onCreate.implementation = function(savedInstanceState) {
        // Εδώ μπορούμε να τοποθετήσουμε τον κώδικά μας που θα εκτελείται κατά την κλήση της μεθόδου .onCreate()
        console.log('Η μέθοδος .onCreate() κλήθηκε!');
        // Καλούμε την αρχική υλοποίηση της μεθόδου .onCreate()
        this.onCreate(savedInstanceState);
    };
});

Ο παραπάνω κώδικας συνδέει τη μέθοδο .onCreate() της κλάσης Activity και αντικαθιστά την υπάρχουσα υλοποίηση με τον δικό μας κώδικα. Στο παράδειγμα, εκτυπώνουμε ένα μήνυμα κατά την κλήση της μεθόδου .onCreate() και καλούμε την αρχική υλοποίηση της μεθόδου για να διατηρήσουμε την αρχική λειτουργικότητα.

Για να εκτελέσουμε τον παραπάνω κώδικα με το Frida, μπορούμε να χρησιμοποιήσουμε την εντολή frida -U -l script.js -f package.name, όπου script.js είναι το αρχείο που περιέχει τον παραπάνω κώδικα και package.name είναι το όνομα της εφαρμογής που θέλουμε να συνδέσουμε τη μέθοδο .onCreate().

Με τη χρήση του Frida, μπορούμε να παρακολουθήσουμε και να τροποποιήσουμε την εκτέλεση μιας εφαρμογής Android, προσφέροντάς μας ένα ισχυρό εργαλείο για τον έλεγχο και την ανάλυση των εφαρμογών.

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

Σύνδεση συναρτήσεων με παραμέτρους και ανάκτηση της τιμής

Σύνδεση μιας συνάρτησης αποκρυπτογράφησης. Εκτύπωση της εισόδου, κλήση της αρχικής συνάρτησης για να αποκρυπτογραφηθεί η είσοδος και τέλος, εκτύπωση των απλών δεδομένων:

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
};

Σύνδεση συναρτήσεων και κλήση τους με την είσοδο μας

Συνδέστε μια συνάρτηση που δέχεται ένα αλφαριθμητικό και καλέστε την με ένα άλλο αλφαριθμητικό (από εδώ)

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;
};

Απόκτηση ενός ήδη δημιουργημένου αντικειμένου μιας κλάσης

Αν θέλετε να εξαγάγετε κάποιο χαρακτηριστικό ενός ήδη δημιουργημένου αντικειμένου, μπορείτε να χρησιμοποιήσετε αυτό.

Σε αυτό το παράδειγμα θα δείτε πώς να αποκτήσετε το αντικείμενο της κλάσης my_activity και πώς να καλέσετε τη συνάρτηση .secret() που θα εκτυπώσει ένα ιδιωτικό χαρακτηριστικό του αντικειμένου:

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

Άλλα μαθήματα Frida

Συμβουλή για bug bounty: εγγραφείτε στο Intigriti, μια προηγμένη πλατφόρμα bug bounty που δημιουργήθηκε από χάκερ, για χάκερ! Γίνετε μέλος στο https://go.intigriti.com/hacktricks σήμερα και αρχίστε να κερδίζετε αμοιβές έως και $100,000!

Μάθετε το hacking του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Last updated