บทความนี้กล่าวถึงวิธีเรียกใช้งาน Function และสามารถกำหนด Parameter ได้เอง จนนำไปประยุกต์ใช้ในการ Bypass หน้า Login ของโปรแกรมที่มีช่องโหว่ โดยเราจะใช้ความสามารถของ Frida ในการ Hook process ของโปรแกรมที่เรากำลังทดสอบ ซึ่งสามารถสรุปหลักการเบื้องต้นโดยสังเขปดังนี้
- ติดตั้ง Frida client และ Server
- เครื่องผ่านการ Root แล้ว
- ทำการ Reverse engineering เพื่อตรวจสอบ Code ที่น่าสนใจ
- ตรวจสอบหน้าที่คาดว่าน่าจะมี Attack surface (Activity | function | Parameter)
- เขียน Code Bypass เพื่อเชื่อมต่อกับ Frida (Python หรือ Javascript)
- Run code ที่เครื่องคอมพิวเตอร์ และใช้งาน Function ที่เครื่อง Android
ขั้นตอน (Steps)
ติดตั้งโปรแกรมช่องโหว่ Sieve
- ติดตั้งโปรแกรม “Sieve” บทเครื่องAndroid หรือ Emulator (How to install sieve.apk on Genymotion Emulator)
- ตั้งรหัสผ่าน และข้อมูล
เชื่อมต่อ Frida และตรวจสอบ Process ของโปรแกรมที่ต้องการทดสอบ
- ติดตั้งโปรแกรม Frida บนเครื่อง Root จากบทความ How to setup Frida for jailbroken device
- เปิด Terminal จากนั้นตรวจสอบ Process ของโปรแกรม Sieve โดยใช้คำสั่ง
frida-ps -aU | grep -i sieve
ทำการ Reverse Engineering เพื่อตรวจสอบ Source code สำหรับกระบวนการ Login
- ทำการ Reverse Engineering เพื่อดู Source code ได้จากบทความ
- จาก Source code เราพบว่า ข้อมูลสำคัญดังนี้
- Class ที่เราสนใจ Bypass คือหน้า login ดังนี้ com.mwr.example.sieve.MainLoginActivity
- Function ที่เราสนใจ Bypass คือ checkKeyResult เป็น Function ที่มี 1 parameter ที่ต้องใส่ เป็นค่า Boolean
- ถ้า True จะเรียก Function ที่ชื่อ loginSuccessful();
- ถ้า False จะเรียก Function ที่ชื่อ loginFailed();
- เพราะฉะนั้นเราจะกรอกค่าจริงเสมอ
- สามารถเขียนเป็น Javascript ใน python code ได้ดังนี้ (ตั้งชื่อไฟล์นามสุล .py)
import frida, sys javascript_code = """ Java.perform(function () { var Activity = Java.use('com.mwr.example.sieve.MainLoginActivity'); Activity.checkKeyResult.implementation = function (a) { send('checkKeyResult'); this.checkKeyResult(true); console.log('Patch done!!!'); }; }); """ process = frida.get_usb_device().attach('com.mwr.example.sieve') script = process.create_script(javascript_code) script.load() sys.stdin.read()
- ไปที่หน้า Login (ถ้าไม่ขึ้นปุ่ม Sign in แต่ให้กรอก pin ให้ไปหน้า App info เพื่อ Force stop และเปิดใช้งานอีกครั้ง)
- ทดลองใช้ python code ที่เราเขียน และกดปุ่ม Sign in จะพบว่าสามารถ Bypass หน้า login ได้
- หรือเขียน Javascript อย่างเดียวได้ดังนี้
Java.perform(function () { var Activity = Java.use("com.mwr.example.sieve.MainLoginActivity"); Activity.checkKeyResult.implementation = function (a) { send("checkKeyResult"); this.checkKeyResult(true); console.log("Patch done!!"); }; });
- ในการเรียกใช้ Javascript ที่เราเขียนให้ใช้คำสั่ง
frida -U -l android.js com.mwr.example.sieve
อ้างอิง
- https://www.frida.re/docs/javascript-api/#java
- https://www.notsosecure.com/pentesting-android-apps-using-frida/