How to bypass the Root Detection (Frida) – Insecure Bank

บทนำ (Overview)

บทความนี้กล่าวถึงวิธีเรียกใช้งาน Function และสามารถกำหนดค่า Return ได้เอง จนนำไปประยุกต์ใช้ในการ Bypass หน้า Detect Roooted Device ของโปรแกรมที่มีช่องโหว่ โดยเราจะใช้ความสามารถของ 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

  1. ติดตั้งโปรแกรมช่องโหว่ “Insecure Bank” (ติดตามได้ที่บทความ How to install InsecureBank)
  2. ทดลอง “Login” จะพบว่า โปรแกรมสามารถตรวจจับได้ว่าโปรแกรมได้ติดตั้งบนเครื่องที่โดน “Root” แล้วandroid-debug-04

เชื่อมต่อ Frida และตรวจสอบ Process ของโปรแกรมที่ต้องการทดสอบ

  1. ติดตั้งโปรแกรม Frida บนเครื่อง Root จากบทความ How to setup Frida for jailbroken device
  2. เปิด Terminal จากนั้นตรวจสอบ Process ของโปรแกรม Sieve โดยใช้คำสั่ง
    frida-ps -aU | grep -i sieve
    

 


ทำการ Reverse Engineering เพื่อตรวจสอบ Source code สำหรับกระบวนการ Login

  1. ทำการ Reverse Engineering เพื่อดู Source code ได้จากบทความ
  2. จาก Source code เราพบ Class น่าสนใจ com.android.insecurebankv2.PostLogin และ Function ที่ชื่อ showRootStatus
     protected void onCreate(Bundle paramBundle)
      {
        super.onCreate(paramBundle);
        setContentView(2130968603);
        this.uname = getIntent().getStringExtra("uname");
        this.root_status = ((TextView)findViewById(2131558511));
        //พบฟังก์ชันชื่อ ShowRootStatus บน onCreate 
        showRootStatus();
        ....
        
      }
    
  3. เมื่อตามไปตรวจสอบฟังก์ชันดังกล่าวพบว่า มีฟังก์ชัน 2 ฟังก์ชันที่ต้องการค่า Return เป็น False ทั้งคู่ ที่จะทำให้โปรแกรมจะบอกสถานะเป็น Device not Rooted!!
     void showRootStatus()
      {
        //พบฟังก์ชันสำหรับตรวจสอบว่าโปรแกรม Superuseer.apk และ Su สามารพบหรือเข้าถึงได้หรือไม่
        if ((doesSuperuserApkExist("/system/app/Superuser.apk")) || (doesSUexist())) {}
        for (int i = 1; i == 1; i = 0)
        {
          this.root_status.setText("Rooted Device!!");
          return;
        }
        this.root_status.setText("Device not Rooted!!");
      }
    
  4. ตามไปตรวจสอบทั้งสองฟังก์ชัน พบว่ามีลักษณะเป็น private และมีค่า return เป็น boolean เหมือนกันทั้งคู่
    private boolean doesSUexist()
      {
        Object localObject3 = null;
        Object localObject1 = null;
        try
        {
          localProcess = Runtime.getRuntime().exec(new String[] { "/system/bin/which", "su" });
          localObject1 = localProcess;
          localObject3 = localProcess;
          String str = new BufferedReader(new InputStreamReader(localProcess.getInputStream())).readLine();
          return str != null;
        }
        catch (Throwable localThrowable)
        {
          Process localProcess;
          if (localObject1 != null) {
            ((Process)localObject1).destroy();
          }
          return false;
        }
        finally
        {
          if (localThrowable != null) {
            localThrowable.destroy();
          }
        }
      }
      
      private boolean doesSuperuserApkExist(String paramString)
      {
        return Boolean.valueOf(new File("/system/app/Superuser.apk").exists()).booleanValue() == true;
      }
    

เขียนโปรแกรมเพื่อเชื่อมต่อกับ Frida สำหรับการ Bypass การตรวจสอบเครื่อง Root

  1. เราสามารถเขียน Code python ได้ดังต่อไปนี้
    import frida, sys
    
    
    jscode = """
    Java.perform(function () {
        var Activity = Java.use('com.android.insecurebankv2.PostLogin');
        Activity.doesSUexist.implementation = function(){
            console.log('Patch1 done!!!');
            return False
        };
    
        Activity.doesSuperuserApkExist.implementation = function(a){
            console.log('Patch2 done!!!');
            return False
        };
    
    
    });
    """
    
    process = frida.get_usb_device().attach('com.android.insecurebankv2')
    script = process.create_script(jscode)
    script.load()
    sys.stdin.read()
    
  2. เมื่อนำไปใช้งานสามารถหลบหลีกการตรวจสอบว่าเครื่อง Root ได้ดังนี้

ใส่ความเห็น