본문 바로가기

4-2. 2024-1 심화 스터디/안드로이드 모의해킹

[7주차] 블레이드러너 - 안드로이드 모의해킹

강의 : 프리다(frida)를 이용한 안드로이드 앱 모의해킹

 

6주차 활동 : 섹션7(프리다 챌린지로 연습 7-8) 섹션8(FRIDA 활용 1-3)


 

7. 챌린지 풀어보기, 일곱번째

7. Bruteforce check07Pin() then confirm with chall07()
@uk.rossmarks.fridalab.MainActivity

@uk.rossmarks.fridalab.challenge_07

chall07 클래스 변수 정의, setChall07()에서 초기화, check07Pin()에서 입력값과 클래스변수 비교.

True가 되는 조건, 문제해결

check07() 입력값 1,000부터 9,999까지 chall07 클래스변수 범위 내 수 브루트보스로 다 입력해보기,

자바스크립트 코드 실행 시, 문제해결 및 안드로이드 단말기 화면에서 clear 확인.

8. 챌린지 풀어보기, 여덟번째

8. Change 'check' buttons's text value to 'Confirm'
@uk.rossmarks.fridalab.MainActivity

'check'버튼의 텍스트를 'Confirm'으로 바꿔야한다.

안드로이드의 UI 함수들은 Main UI Thread에서 동작한다. 

그래서 Main instance를 불러온 상태에서 findViewByld를 사용할 수 있고,

@uk.rossmarks.fridalab.R.id

True가 되는 조건.
import frida

jscode = """
Java.perform(function(){
    //chall08
    var main;
    Java.choose('uk.rossmarks.fridalab.MainActivity', {
    onMatch: function(instance) {
        main = instance;
    },
    onComplete: function() {}
    });

    var id = main.findViewById(2131165231);
    var button = Java.use('android.widget.Button');
    var checkButton = Java.cast(id, button);
    var string = Java.use('java.lang.String');
    checkButton.setText(string.$new('Confirm'));
});
"""

process = frida.get_usb_device().attach('uk.rossmarks.fridalab')
script = process.create_script(jscode)
script.load()
raw_input()

        }
    }


});
"""

process = frida.get_usb_device().attach('uk.rossmarks.fridalab')
script = process.create_script(jscode)
script.load()
raw_input()

1. FRIDA 활용, 루팅 탐지 우회

앱 UnCrackable-Level1.apk

다운로드 후 앱 실행 시 'Root detected' 루팅 탐지에 걸려 실행시킬 수 없다.

@sg.vantagepoint.uncrackable1.MainActivity

a메서드 호출하면서, 루팅 탐지 문자열 전달.

루팅 탐지 우회 : Onclick 실행 시, System.exit 실행안 되도록
setImmediate(function(){
	Java.perform(function(){
		var exitBypass = Java.use("java.lang.System");
		exitBypass.exit.implementation = function () {  // function (arg) 받아도 상관 없음
			console.log("[*] 루팅 탐지 후킹 성공!");
		}
	})
})

 

2. FRIDA 활용, 로그인 우회

앱 sieve.apk

로그인, 회원가입 창이 뜨고 ID PW 입력하는 창을 띄우는 기능 존재.

임의의 ID, PW로 회원가입한다.

우회 대상: 잘못된 PIN 입력시 'This password is incorrect' 문구 출력

@com.mwr.example.sieve.MainLoginActivity 

loginsSucessful 메서드 후킹한다.

checkKeyResult Input 항상 true
setImmediate(function(){
	Java.perform(function(){
		var login_bypass = Java.use("com.mwr.example.sieve.MainLoginActivity");
		login_bypass.checkKeyResult.implementation = function(arg){ // 인자값 하나 받고 있음 checkKeyResult(boolean status)
			console.log("\n[+] 로그인 우회 성공!\n");
			this.checkKeyResult(true);  // checkKeyResult의 기존 조건 분기 로직을 그대로 동작시키면서 무조건 true로 빠지도록!
		}
    })
})

위 자바스크립트 실행 후 , 아무 PW으로 로그인 시도.

PIN 우회는 ShortLoginActivity (MainLoginActivity 대신)

3. FRIDA 활용, 브루트포스 PIN

앱 seive.apk

Goal: PIN 번호를 브루트포스하여 올바른 PIN 번호 값을 획득

com.mwr.example.sieve.ShortLoginActivity

submit()메소드에서 PIN 번호 검사하는 로직 존재할 것으로 추측.

wokingPIN 변수에 입력한 PIN 번호값 담겨 있고, serviceConnection.checkPin() 메소드의 인자값으로 전달된다. serviceConnection.checkPin() 메소드를 0000부터 9999까지의 범위로 브루트포스하여 정확한 PIN 번호를 찾 코드를 작성한다. 

// sieve.js
setImmediate(function() {
  Java.perform(function() {
    // 패스워드 우회 로직 생략
    
    function padToFour(number) { // 자릿수가 모자란 정수의 경우 앞에 0을 채워넣는 함수
      if(number<=9999) {
        number = ("000"+number).slice(-4);
      }
      return number;
    }
    
    var pinBypass = Java.use("com.mwr.example.sieve.ShortLoginActivity");
    pinBypass.submit.implementation = function(arg) {
      var service = this.serviceConnection.value; // serviceConnection 클래스 객체 값을 가져옴
      for(var i=0;i<9999;i++) {
        service.checkPin(padToFour(i));
        console.log(padToFour(i));
      }
    }
  })
})

checkPin() 메소드 호출 위해서 pinBypass 변수로 필요한 클래스 호출했다.

스크랩트 인젝션 후 틀린 PIN 번호를 입력하면 콘솔에 0000부터 9999까지 출력되면서

올바른 PIN 번호가 입력되어 저장된 데이터를 확인할 수 있다.