본문 바로가기
Hack/Mobile

MobileSecurity App Challenge 정답

by Becoming a Hacker 2020. 9. 22.
반응형

개요

이 전 포스팅에서, 공개했던 Frida Hooking 용 Android App인 'MobileSecurity' 문제 정답 입니다.

 

해당 앱에 대한 자세한 내용이 궁금하신 분들은 아래의 링크에서 확인하시길 바랍니다.

 

MobileSecurity App으로 Frida 관련 문제 풀어보기

개요 Android 앱에서 Frida를 통하여 우회할 수 있는 기본적인 내용들을 정리해보고, Frida를 처음 접한 사람들을 위해 발판을 마련하고자 MobileSecurirty App을 만들게 되었습니다. 해당 앱은 총 5개의 문

hacksms.tistory.com


정답

각 문제들을 우회 가능한 Frida Code가 포함되어 있습니다. 문제를 푸시기 전에 정답을 보지 않는 것을 권해드립니다.

 

물론, setOutput 함수를 후킹하지 않고 문제를 푸신 분들이라면 작성하신 코드 모두 정답 입니다. :-)

 

1. 로그인 인증 우회

문제 : 잘못된 아이디, 패스워드 입력 시 'You are Administrator' 문구 띄우기

더보기

우회 과정

get_account() 메소드의 리턴 값 변경으로 우회하기

Java.perform(function(){
    var ch1 = Java.use("com.sms.mobilesecurity.Challenge1");
    var SpannableStringBuilder = Java.use("android.text.SpannableStringBuilder");

    ch1.get_account.implementation = function(arg1, arg2){
        var id = Java.cast(arg1,SpannableStringBuilder);
        var pwd = Java.cast(arg2,SpannableStringBuilder);
        console.log("ID : "+id+" / PWD : "+pwd);
        console.log("Login Bypass");
        return 1;
    }
}

 

2. 지문 인증 우회

문제 : 잘못된 지문 인증 시 '로그인에 성공하였습니다.' 문구 띄우기

더보기

우회 과정

onFailed 호출 시 on Successed 호출로 우회하기

Java.perform(function(){
	// Challenge2
    var finger = Java.use("com.sms.mobilesecurity.FingerprintHandler");
    
    finger.onFailed.implementation = function(arg1){
        this.onSuccessed("로그인에 성공하였습니다.");
        console.log("Login Bypass");
    }
}

 

3. 루팅 탐지 우회 (기본)

문제 : 루팅 탐지 수행 버튼 클릭 시 'Device is not Rooting' 문구 띄우기

더보기

우회 과정

su 명령어 실행 여부 및 File 존재 유무로 확인하는 과정 우회하기

Build.TAGS의 test-key 유무로 확인하는 과정 우회하기

Java.perform(function(){
 	// Challenge3
    var exec = Java.use('java.lang.Runtime').exec;
    var file = Java.use('java.io.File');
    var tags = Java.use('android.os.Build').TAGS;

	exec.overload('java.lang.String').implementation = function(arg1){
        console.log("Level 1 Rooting Bypass arg : "+arg1);
        var retval = this.exec("");
        return retval;
    }
    file.$init.overload('java.lang.String').implementation = function(arg1){
        console.log("Level 2 Rooting Bypass arg : "+arg1);
        var retval = this.$init("");
        return retval;
    }
    
    tags.value="release-keys";
}

 

4. 루팅 탐지 우회 (심화)

문제 : 루팅 탐지 수행 버튼 클릭 시 'Device is not Rooting' 문구 띄우기

더보기

우회 과정

su 명령어 실행 여부 및 File 존재 유무로 확인하는 과정 우회하기

Build.TAgS의 test-key 유무로 확인하는 과정 우회하기

ps 명령어를 통하여 특정 프로세스가 실행중인지 확인하는 과정 우회하기

결과를 전부 false 시키는 걸 방지하기 위해 ps 실행 중 예외 발생 시 루팅으로 탐지하는 과정 우회하기

Java.perform(function(){
 	// Challenge4
    var exec = Java.use('java.lang.Runtime').exec;
	var file = Java.use('java.io.File');
	var tags = Java.use('android.os.Build').TAGS;
    var buf = Java.use("java.io.BufferedReader");

    exec.overload('java.lang.String').implementation = function(arg1){
        console.log("Level 1 Rooting Bypass arg : "+arg1);
        if(arg1=='su'){
            arg1="";
        }
        var retval = this.exec(arg1);
        return retval;
    }
    
    file.$init.overload('java.lang.String').implementation = function(arg1){
        console.log("Level 2 Rooting Bypass arg : "+arg1);
        var retval = this.$init("");
        return retval;
    }
    
    tags.value="release-keys";

    buf.readLine.overload().implementation = function(){
        var retval = this.readLine();
        if(retval){
            if(retval.indexOf("eu.chainfire.supersu")!=-1 || retval.indexOf("xposed")!=-1 || retval.indexOf("me.twrp.twrpapp")!=-1 || retval.indexOf("com.devadvance.rootcloak")!=-1){
                console.log("Level 3 Rooting Bypass ret : "+retval);
                retval="";
            }
        }
        return retval;
    }

}

 

5. 루팅 및 후킹 탐지 우회

문제 : 후킹 탐지 수행 버튼 클릭 시 'Hooking not Detection' 문구 띄우기

더보기

우회 과정

Stack의 XposedBridge 존재 유무로 확인하는 과정 우회하기

/proc/pid/maps 데이터 중 특정 값 존재 유무로 확인하는 과정 우회하기

Java.perform(function(){
    // Challenge5
    var stack = Java.use("java.lang.StackTraceElement");
    var fr = Java.use("java.io.FileReader");
    
    stack.getClassName.implementation = function(){
        var retval = this.getClassName();
        if(retval.indexOf("XposedBridge")!=-1){
            console.log("Level1 Rooting and Hooking Bypass ret : "+retval);
            retval="";
        }
        return retval;
    }

    fr.$init.overload('java.lang.String').implementation = function(arg1){
        if(arg1.indexOf("proc")!=-1){
            console.log("Level2 Rooting and Hooking Bypass arg1 : "+arg1);
            arg1="/proc/2/maps";
        }
        this.$init(arg1);
    }
}

댓글